给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
示例:
输入: 13
输出: 6
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。
思路:
统计出每一的位上1出现的个数,累加起来就是1出现的总个数。
num = 31456
现在统计百位上1出现的次数。
将num分成两部分(根据百位),a = 314,b=56。
此时a的个位是4(即num的百位是4),此时该为出现1的次数为:31*100次。
假设a的个位数是x,
当x > 1时,百位出现1的次数:(a / 10 + 1) * 100
当x = 1时,百位出现1的次数:(a / 10 ) * 100 + b + 1 (0~b)
当x = 0时,百位出现1的次数:(a / 10 ) * 100
根据规律,可以分为两类,一类x >= 2;一类0 <= x < 2,用一个表达式写出:
(a+8) / 10 * 100 ,再将x = 1的特殊情况写入表达式:(a+8) / 10 * 100 + (a % 10 == 1 ) * (b + 1)
class Solution {
public:
int countDigitOne(int n) {
if(n == 0) return 0;
int res = 0;
for(long i = 1;i<=n;i*=10){
int a = n/i,b = n%i;
res += (a+8)/10 * i + (a%10 == 1) * (b+1);
}
return res;
}
};