给定一个整数 n
,计算所有小于等于 n
的非负整数中数字 1
出现的个数。
示例 1:
输入:n = 13
输出:6
示例 2:
输入:n = 0
输出:0
提示:
0 <= n <= 109
- 设f(n) 表示所有小于等于n的数字中1的个数
- 比如2345
- [0,999]中 共有f(999) 个1
- [1000, 1999] 中1的个数
- 1开头的任何一个数都包含千位数1,共1000种
- 后三位数共有f(999)个1
- [2000, 2345] 共有 f(345)个1
- 比如1345
- [0,999] 共有f(999)种
- [1000, 1345] 中
- 1开头的任何一个数都包含一个1, 共有345+1个
- 后三位数共有f(345)个1
- 总之,有 p* f(num-1)+f(q) + p== 1?q+1:num 种
class Solution {
public:
int countDigitOne(int n) {
if(n<10) return n>=1?1:0;
string str = to_string(n);
int p = stoi(str.substr(0,1));
int q = stoi(str.substr(1,str.size()-1));
int num = pow(10, str.size()-1);
if(p>1){
return countDigitOne(q) + num + p*countDigitOne(num-1);
}
else{
return countDigitOne(q) + q+1 + p*countDigitOne(num-1);
}
}
};