数位DP-2出现的次数

问题描述

编写一个方法,计算从 0 到 n (含 n) 中数字 2 出现的次数。

示例:
输入: 25
输出: 9
解释: (2, 12, 20, 21, 22, 23, 24, 25)(注意 22 应该算作两次)
提示:

n <= 10^9

问题求解

class Solution:
    def numberOf2sInRange(self, n: int) -> int:
        s = str(n)

        @cache
        def f(i, is_limit, cnt):
            if i == len(s):
                return cnt
            
            res = 0
            up = int(s[i]) if is_limit else 9
            for d in range(0, up + 1):
                res += f(i + 1, is_limit and d == up, cnt + int(d == 2))
            return res
        
        return f(0, True, 0)
posted @ 2022-08-14 20:40  hyserendipity  阅读(23)  评论(0编辑  收藏  举报