要求
给定一个非负整数 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
解题思路: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,就是排列的思想。