首先我们想到的是如果一个一个数字去计算, 那么对于这个n的范围是会超时的。 所以是数位dp,按位去计算。
class Solution {
public:
int numberOf1Between1AndN_Solution(int n) {
if(!n ) return 0; // 如果当前是0 直接返回0
vector<int> num; // 用来存储数字n的每一位
while(n) num.push_back(n%10), n/= 10;
int res = 0;// 存储结果
for(int i = num.size()-1; i >= 0; i --) // 从高位开始往低位枚举
{
int left = 0, right = 0, t = 1;
for(int j = num.size() - 1; j > i; j -- )
left = left * 10 + num[j];
for(int j = i-1; j >= 0; j --)
right = right * 10 + num[j], t *= 10;
res += left * t; // 这里就是把情况1直接加进来了, 因为三种情况都包含①, 当c=0的时候,只有①, 所以可以不用枚举c=0
if(num[i] == 1)
{
res += right + 1;
}
else if(num[i] > 1)
{
res += t;
}
}
return res;
}
};