总的思想是先分类(个位,十位,百位),再对各种情况进行统计(前缀有多少种,后缀有多少种,并利用相乘原理)。
以3141592为例,数字1出现在个位,十位,百位,千位,万等等。
下面开始对各种情况进行统计:
1、出现在个位的1的数量为
000000 1
.
.
.
314158 1
把最后的前缀314159单独考虑
2、出现在百位的1的数量为
0000 1
.
.
.
3140 1
在百位1的数量为前缀后缀 = 3141 100
把最后的前缀3141单独考虑。
具体再参考https://leetcode.com/discuss/44281/8-lines-o-log-n-c-java-python
这样应该就能理解了
class Solution {
public:
int countDigitOne(int n) {
int result = 0;
for(int m = 1; m <= n; m = m * 10)
result += (n / m + 8) / 10 * m + ((n / m % 10 == 1) ? (n % m + 1) : 0);
return result;
}
};