题目链接
题目描述
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例 1:
输入:n = 12
输出:5
示例 2:
输入:n = 13
输出:6
限制:
1 <= n < 2^31
解题思路
直接甩文章,套模板
【算法】【动态规划】从1到n整数中1出现的次数:O(logn)算法_Elephant_King的博客-优快云博客
题解
class Solution {
public:
string t;
int getNum(int a,int b){
if(a>b) return 0;
return stoi(t.substr(a,b-a+1));
}
int countDigitOne(int n) {
int sum=0;
t=to_string(n);
for(int i=0;i<t.length();i++){
if(t[i]=='0'){ //等于零时
//sum+=left*right的位数
sum+=getNum(0,i-1)*pow(10,(t.length()-i-1));
}
else if(t[i]=='1'){ //等于1的时候
//sum+=left*right的位数+right的值+1
sum+=getNum(i+1,t.length()-1)+1+getNum(0,i-1)*pow(10,(t.length()-i-1));
}
else{ //大于1的时候
//sum+=(left+1)*right的位数
sum+=pow(10,(t.length()-i-1))*(getNum(0,i-1)+1);
}
}
return sum;
}
};