给你一个整数 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