题目
输入一个整数 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
代码
Python
# 思路:
# 考察时间效率,注意找规律求解
# 复杂度:
# O(logN)
class Solution:
def countDigitOne(self, n: int) -> int:
res,num=0,1 # 结果,因子初始化
high,cur,low=n//10,n%10,0 # 数字三段初始化
while high!=0 or cur!=0:
if cur==0: res+=high*num # 规律1
elif cur==1: res+=high*num+low+1 # 规律2
else: res+=(high+1)*num # 规律3
# 参数更新
low+=cur*num
cur=high%10
high//=10
num*=10
return res
C++
class Solution {
public:
int countDigitOne(int n) {
long res=0,num=1;
long high=n/10,cur=n%10,low=0;
while (high!=0||cur!=0) {
if (cur==0) {
res+=high*num;
}
else if (cur==1) {
res+=high*num+low+1;
}
else {
res+=(high+1)*num;
}
low+=cur*num;
cur=high%10;
high/=10;
num*=10;
}
return res;
}
};