📅  最后修改于: 2023-12-03 15:13:06.190000             🧑  作者: Mango
给定一个整数n,求从1-n中的所有数字中,数字2出现的次数。
我们可以从1-n中枚举每个数字,然后计算出该数字中数字2出现的次数,最后累加得到总次数。
def count_2(n: int) -> int:
count = 0
for i in range(1, n+1):
count += str(i).count('2')
return count
时间复杂度:$O(nlogn)$,因为每个数字最多有$log_{10}n$位。
从最高位开始,我们可以统计以下两种情况:
def count_2(n: int) -> int:
if n < 2:
return 0
res = 0
digit = 1
while n // digit:
low = n % digit
high = n // (digit * 10)
cur = (n // digit) % 10
if cur == 0:
res += high * digit
elif cur == 1:
res += high * digit + low + 1
else:
res += (high+1) * digit
digit *= 10
return res
时间复杂度:$O(logn)$,因为只需要遍历数字的每一位。
本题是一道很有意思的数位dp题目,需要考虑怎么计算每一位上数字2的出现次数。同时也可以用枚举的方法计算来进行对照比较,更好地理解数位dp。