美文网首页
1~n 整数中 d 出现的次数

1~n 整数中 d 出现的次数

作者: 深圳都这么冷 | 来源:发表于2022-05-07 21:32 被阅读0次

    这是一道有趣的算法题,题目见:

    233. 数字 1 的个数

    剑指 Offer 43. 1~n 整数中 1 出现的次数

    面试题 17.06. 2出现的次数

    居然在三题中出现,确实是很有意思!

    思路

    根据n每一位的数字分治,举个例子
    n = 12345
    个位,factor=1时, high=1234,current=5, low=0
    十位,factor=10时, high=123,current=4, low=5
    百位,factor=100时, high=12,current=3, low=45
    ...

    • 先考虑右边低位

    当current小于d时,左边低位无论怎么折腾,current所在位都不会贡献任何一次数字d,所以贡献0次
    当current等于d时,固定current所在位为d,左边低位从0到low跑low+1遍,所以贡献low+1次
    当current大于d时,固定current为d,左边低位从0到factor-1跑factor遍,所以贡献factor次

    • 再考虑右边

    对于从1到high的每一个高位数字,current所在位都会出现factor*10次,依次为0123456789,其中只有1次是d,每一个高位数字带动current所在位贡献factor次
    所以左边累计贡献为固定的:high * factor

    class Solution:
        def numberOf2sInRange(self, n: int) -> int:
            return digit_times(n, 2)
    
    def digit_times(x, d):
        """ 0 <= d, current <= 9 """
        ans = 0
        factor = 1
        while x >= factor:
            high = x // (factor*10)  # 左边高位
            current = (x % (factor * 10)) // factor
            low = x % factor  # 右边低位
            # factor位是d的数字个数
            if current < d:
                ans += high * factor
            elif current == d:
                ans += high * factor + low + 1
            else:  # current > d
                ans += high * factor + factor
            factor *= 10
        return ans
    

    相关文章

      网友评论

          本文标题:1~n 整数中 d 出现的次数

          本文链接:https://www.haomeiwen.com/subject/sxoxurtx.html