Leetcode每日一题-2021-8-13<数字 1 的个数>(规律)
链接:https://leetcode-cn.com/problems/number-of-digit-one/
题意:给定数字n,计算所有小于等于n的非负数中1的个数和
思路:计算每一个位为1的情况,对于某位,numl-i-numr,numl是前缀,numr是后缀,计算i=1时前缀和后缀满足构成的数字小于n的种类数
对于前缀为[0,numl)时,i=1,则numr可以为任何数,若numr长度为m,numr共10^m中,对应种类数为numl*10^m
对于前缀为numl时,就需要根据i的情况来判断i=1时的种类数
i==0 时,i不能为1,相应种类数为0
i==1 时,当i=1,相应种类数为numr+1(numr=0的情况)
i>1 时,当i=1,numr可以为任何数 相应种类数为10^m
代码:
class Solution {
public:
vector<int> ans;
void cou(int x){//将数转为数组
if(x<10){
ans.emplace_back(x);
return ;
}
cou(x/10);
ans.emplace_back(x%10);
}
int countDigitOne(int n) {
int res=0,atm=0;
cou(n);
int len=ans.size();
for(int i=0;i<len;i++){
int t=i+1;
res+=(atm*pow(10,(len-t)));
atm=atm*10+ans[i];
if(ans[i]>1){
res+=pow(10,len-t);
}
else if(ans[i]==1){
res+=n-atm*pow(10,len-t)+1;
}
}
return res;
}
};

浙公网安备 33010602011771号