一个数一个数的判断,时间复杂度是O(nlogn) 显然不是面试管期望的回答
用数学方法,我们一次计算出每一位上所有小于等于n上1出现的个数。
举个例子abcdefg这个数以下的数,千位d上1出现的个数
如果d=0,abc可以从0取到abc-1,d取1,efg可以从0取到999,共有abc*1000种情况
如果d=1,除了之前的取法,efg还可以从0取到efg,还有efg+1种
如果d>1, abc可以从0取到abc,d取1,efg可以从0取到999,共(abc+1)*1000,因此不难写出代码
class Solution {
public:
int countDigitOne(int n) {
if(n<=0) return 0;
string digit = to_string(n);
int res = 0;
for(int i=0;i<digit.size();i++){
int left = 0, right = 0, p = 1;
for(int j=0;j<i;j++) left = (left*10) + (digit[j]-'0');
for(int j=i+1;j<digit.size();j++){
right = (right*10) + digit[j]-'0';
p*=10;
}
if(digit[i]=='0'){
res+= left*p;
}else if(digit[i]=='1'){
res+= (left*p)+right+1;
}else{
res+= (left+1)*p;
}
}
return res;
}
};