题目描述
思路分析
数位统计dp的简单版
这道题分别枚举每一位上1出现的次数即可。更一般的题目是问:
[
a
,
b
]
[a,b]
[a,b]中
0
−
9
0-9
0−9各出现多少次,这个可以参考我的其他题解。
时间复杂度
O
(
l
o
g
2
n
)
O(log^2n)
O(log2n),预处理
l
e
f
t
,
r
i
g
h
t
left,right
left,right和
t
t
t可以做到
O
(
l
o
g
n
)
O(logn)
O(logn)
代码实现
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n) {
if(!n) return 0;
vector<int> numbers;
while(n) numbers.push_back(n%10),n/=10;
int res=0;
for(int i=numbers.size()-1;i>=0;i--){
auto left=0,right=0,t=1;
for(int j=numbers.size()-1;j>i;j--){
left=left*10+numbers[j];
}
for(int j=i-1;j>=0;j--) right=right*10+numbers[j],t*=10;
res+=left*t;
if(numbers[i]==1){
res+=right+1;
}
else if(numbers[i]>1) res+=t;
}
return res;
}
};