题目描述
给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
示例:
输入: 13 输出: 6 解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。
问题分析
假设我们要计算一个六位数abcdef有多少个1,那么我们要计算6个位置分别出现了多少次1,最后把6个位置的结果加和就是答案了。假如当前正在计算位置 c 出现了多少个1:_ _ c _ _ _,变量left为ab,变量right为def。先计算头两位小于ab的情况:为ab * 1000;然后计算当头两位为ab的情况:当c等于1时,为def + 1,当c大于1时,为1000。这样位置c出现了多少个1就计算出来了。我们用同样的方法计算其它位置的,最后将6个位置的结果加和就是答案了。
代码实现
class Solution {
public:
int countDigitOne(int n) {
int ans = 0;
vector<int> number;
while(n){
number.push_back(n % 10);
n /= 10;
}
reverse(number.begin(), number.end());
for(int i = 0; i < number.size(); i++){
int left = 0, right = 0, t = 1;
for(int j = 0; j < i; j++)
left = left * 10 + number[j];
for(int j = i + 1; j < number.size(); j++){
right = right * 10 + number[j];
t *= 10;
}
ans += left * t;
if(number[i] == 1)
ans += right + 1;
else if(number[i] > 1)
ans += t;
}
return ans;
}
};