leetcode_357 计算各个位数不同的数字个数

154 阅读1分钟

要求

给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n 。

示例:

输入: 2
输出: 91 
解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字。

核心代码

class Solution:
    def countNumbersWithUniqueDigits(self, n: int) -> int:
        res = 1
        for i in range(min(9,n),0,-1):
            tmp = 1
            for j in range(i):
                if j == 0:
                    tmp *= 9
                else:
                    tmp *= 10 -j
            res += tmp
        return res 

image.png

解题思路:n=0时,return 1;n=1时,x=0~9都是不同的,return 10,其中10-9+1;n=2时,只有一位但不同的有10个,有两位且每位数字都不同的有9*9=81,所以总体return 81+10=91;n=3时,有三位但每位数字都不同的有9*9*8=648,再加上n=2时的返回结果91,总体return 648+91=739;所以当n=k时,有k位但每位数字都不同的有9*9*8*.....*(10-k+1)。但当k>=10之后,不能存在有十位但每位数字都不同的数字,所以会先在k与9之间取最小;

对上面思路的理解:其实就是排列问题,我们以3位的数字为例,第一位数字1~9中选择一个,有9种选择,第二位数字0~9中除了第一位的那个数字,一共有9种选择,第三位数字,除去前两位数字,一共有8种选择。三位都在的时候9 * 9 * 8,就是排列的思想。