📌  相关文章
📜  1920 2 (1)

📅  最后修改于: 2023-12-03 15:13:06.190000             🧑  作者: Mango

1920 2题解

题目描述

给定一个整数n,求从1-n中的所有数字中,数字2出现的次数。

解题思路
方法1:枚举

我们可以从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$位。

方法2:数位dp

从最高位开始,我们可以统计以下两种情况:

  1. 当前位是0的时候,贡献为$high*digit$;
  2. 当前位是1的时候,贡献为$high*digit+low+1$;
  3. 当前位大于等于2的时候,贡献为$(high+1)*digit$。
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。