题目描述
输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。
例如输入12,从1到12这些整数中包含“1”的数字有1,10,11和12,其中“1”一共出现了5次。
样例
输入: 12
输出: 5
问题分析
假设我们要计算一个六位数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 numberOf1Between1AndN_Solution(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;
}
};