给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
示例:
输入: 13
输出: 6
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-digit-one
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
int countDigitOne(int n) {
if(n <= 0) return 0;
if(n < 10) return 1; //注意退出递归的条件
int digit = 0;
int numHead = calcHead(n, digit); //获取最高位及除去最高位后的位数
int numLast = calcLast(n); //获取除去最高位的剩余部分
if(numHead == 1)
{
//若最高位为1,最高位贡献numLast+1个1,
return (countDigitOne(pow(10, digit)-1) + countDigitOne(numLast) + numLast+1);
}
else
{
//若最高位不为1,最高位贡献pow(10, digit)个1,剩余位贡献1个数numHead * countDigitOne(pow(10, digit)-1)
return (numHead * countDigitOne(pow(10, digit)-1) + pow(10, digit) + countDigitOne(numLast));
}
}
private:
int calcHead(int n, int &num)
{
num = 0;
while(n / 10)
{
num++;
n /= 10;
}
return n;
}
int calcLast(int n)
{
if(n < 10) return 0;
string strTmp = to_string(n);
string strRes = strTmp.substr(1, strTmp.length()-1);
return stoi(strRes, 0, 10);
}
};