357. 统计各位数字都不同的数字个数

给你一个整数 n ,统计并返回各位数字都不同的数字 x 的个数,其中 0 <= x < 10^n 。

输入:n = 2
输出:91
解释:答案应为除去 11、22、33、44、55、66、77、88、99 外,在 0 ≤ x < 100 范围内的所有数字。 

提示:

  • 0 <= n <= 8
class Solution(object):
    def countNumbersWithUniqueDigits(self, n):
        """
        :type n: int
        :rtype: int
        """
    # 第一种方法超时了
    #     if n == 0:
    #         return 1
    #     if n == 1:
    #         return 10

    #     result = 10
    #     i = 2
    #     while i <= n:
    #         current_level = self.count_level(9, i)
    #         result += current_level
    #         i += 1
        
    #     return result
    
    # def count_level(self, m, n):
    #     if 11 - n == m:
    #         return m * 9
    #     return m * self.count_level(m-1, n)#这样有些乘法步骤是重复了,每次更大的一个n进来,会重复之前的小n计算过的乘法运算
    
    # 以下是第二种方法
        if n == 0:
            return 1
        if n == 1:
            return 10#只有一个个数,0-9 选一个
        if n == 2:
            return 91#10个个位数,加9*9 81个十位数:十位数1-9,个位数是0-9
        # nums = {}
        # nums[0] = 1
        # nums[1] = 10
        nums = 81#初始num 是第二层上,也就是十位数能有9 9 81个
        i = 3
        result = 91
        while i <= n:
            nums = (11-i) * nums#由小而大逐层计算,这样不用重复计算乘法。11-i是看规律出来的,不是通用的方法。
            #第二层 9*9; 第三层9*9*8 此时百位数1-9,十位0-9减去跟百位相同的,个位只能0-9 10个 减去百位和十位相同的2个
            #一次类推,第三层 乘到8结束,11-3
            result += nums
            i += 1
        return result

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值