-
给你一个整数
n
,统计并返回各位数字都不同的数字x
的个数,其中0 <= x < 10n
。 1 -
示例:
# 示例 1
输入:n = 2
输出:91
解释:答案应为除去 11、22、33、44、55、66、77、88、99 外,在 0 ≤ x < 100 范围内的所有数字。
# 示例 2
输入:n = 0
输出:1
-
提示:
0 <= n <= 8
-
思路:
采用递归,先设置递归的出口,若n减到0了,返回1
循环逻辑为:
f(0) = 1
f(1) = 9 + f(0)
f(2) = 9 * 9 + f(1)
f(3) = 9 * 9 * 8 + f(2)
…
设置一个值为9,再在输入的值里面设置一个循环从1遍历到n,分析可知要想定义一个9和另一个9不变,那么加起来的值一定等于10,然后函数的实现如下解法一
返回前一个值的ans加上函数的递归
- 解法一–递归:
class Solution:
def countNumbersWithUniqueDigits(self, n: int) -> int:
if n == 0:
return 1
ans = 9
for i in range(1, n):
ans *= (10 - i)
return ans + self.countNumbersWithUniqueDigits(n - 1)
- 思路:
设置了两个函数,首先看cntpo,这个函数是返回每几位数之间的不符合条件的数的总和
countNumbersWithUniqueDigits函数是将每个不符合条件的数的总和加起来,再返回一个总数减去不符合条件的数,即符合条件的数
- 解法二–暴力解法:
class Solution:
def countNumbersWithUniqueDigits(self, n):
s = 0
for i in range(1, n + 1):
j = self.cntpo(i)
s += j
s_sum = pow(10, n)
return s_sum - s
def cntpo(self, n):
cnt = 0
for i in range(pow(10, n-1), pow(10, n)):
for j in str(i):
if str(i).count(j) > 1:
cnt += 1
break
return cnt
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-numbers-with-unique-digits/ ↩︎