357、统计各位数字都不同的数字个数
给你一个整数 n
,统计并返回各位数字都不同的数字 x
的个数,其中 0 <= x < 10n
。
示例1:
输入:n = 2
输出:91
解释:答案应为除去 11、22、33、44、55、66、77、88、99 外,在 0 ≤ x < 100 范围内的所有数字。
示例2:
输入:n = 0
输出:1
思路:
这道题一看是一个组合的问题,从10个数中选出数字作为每个数位的值,组成数字的个数。那么这里就需要考虑首位为0的情况,由于数字高位为0是不计为相同数字的,所以n位数我们可以将之看成首位为1~9的n位数 + 首位为1~9的n-1位数+…这样看起来就比较好理解了。
那么高位不为0的n位不同数字的个数是多少呢?
9 ∗ A 9 n − 1 9 * A_9^{n-1} 9∗A9n−1
那么对于题目所求则是:
∑ x = 0 n − 1 9 ∗ A 9 x − 1 \sum_{x=0}^{n-1}{9*A_9^{x-1}} ∑x=0n−19∗A9x−1
class Solution:
def countNumbersWithUniqueDigits(self, n: int) -> int:
# 高位不为0的n位不同的数字个数
def dfs(n):
ans, max = 9, 9
while n > 1:
ans = ans * max
n, max = n - 1, max - 1
return ans
# 不断累加高位不为0的n为不同的数字个数
ans = 1
while n:
ans += dfs(n)
n -= 1
return ans
也可以在遍历的同时将求和和阶乘一起计算
class Solution:
def countNumbersWithUniqueDigits(self, n: int) -> int:
if n == 0: return 1
# res存储阶乘和,ans存储当前阶乘
res, ans = 10, 9
for i in range(n - 1):
ans *= 9 - i
res += ans
return res