首先要知道,例如当一个 n 为 ABCDEF 时 出现 1 的次数为 A倍的 当n = 99999 时出现 1 的次数 加上 n = BCDEF时 1 出现的次数 再加上 100000(对当首位为 1 或 0 时进行额外的判断) ,用同样的方法可以递推 n为BCDEF时 1的次数,直到只剩下 F
所以先循环求出 n = 9,99,999,9999……有多少个 1 并记录
然后对 n 从高位向低位递归判断要加上多少个 1
class Solution {
public int countDigitOne(int n) {
int ans = 0;
if(n < 10){
return 1;
}else{
ans ++;
}
int k = 2;
int[] num = new int[15];
num[1] = 1;
while(n >= Math.pow(10,k)){
ans *= 10;
ans += Math.pow(10,k - 1);
num[k] = ans;
k++;
}
ans = 0;
while(k > 1){
int m = n / (int)Math.pow(10,k - 1);
if(m == 1){
ans += n % Math.pow(10,k - 1) + 1;
}
else if(m != 0)
ans += Math.pow(10,k - 1);
while(m > 0){
ans += num[k - 1];
m--;
}
n %= Math.pow(10,k - 1);
k--;
}
if(n % 10 > 0)
ans++;
return ans;
}
}