思路:
Reference:DISCUSS。
Tip:
每10个数,有1个个位是1;
每100个数,有10个十位是1;
每1000个数,有100个百位是1;
将各个位上的1的个数加起来即是所求。
以算百位上1为例子: 假设百位上是0, 1, 和 >=2 三种情况:
case 1: n=3141092, a=31410, b=92. 计算百位上1的个数应该为 3141*100 次.
case 2: n=3141192, a=31411, b=92. 计算百位上1的个数应该为 3141*100 + (92+1) 次.
case 3: n=3141592, a=31415, b=92. 计算百位上1的个数应该为 (3141+1)*100 次.
以上三种情况可以用 一个公式概括:m表示位数
(a + 8) / 10 * m + (a % 10 == 1) * (b + 1);
java code:
public class Solution {
public int countDigitOne(int n) {
int count = 0;
for(long m = 1; m <= n; m *= 10) {//从计算个位是1开始,一直计算到最高位
long a = n / m;
long b = n % m;
count += (a + 8) / 10 * m;
if(a % 10 == 1) {
count += b + 1;
}
}
return count;
}
}