文章目录
- 题目描述
- 简化题目
- 思路分析
- 完整代码
题目描述
给你一个整数 n ,统计并返回各位数字都不同的数字 x 的个数,其中 0 <= x < 10的n次方 。
示例 1:
输入:n = 2
输出:91
解释:答案应为除去 11、22、33、44、55、66、77、88、99 外,在 0 ≤ x < 100 范围内的所有数字。
示例 2:
输入:n = 0
输出:1
简化题目
这道题说的还算清楚吧。根据题目0 <= x < 10的n次方 。
- n = 0 数字范围只有1
- n = 1 数字范围0-9
- n = 2 数字范围0-100
其中每一位都不能相等。比如 99 ,101,9091 这几种都是不行的。
思路分析
这应该算是一道easy题。
n= 0 和n = 1的时候 排列组合就是全部(都符合条件 1和0-9嘛 )。当n = 2的时候 所有可能的数字就是 0-9 再加上所有两位数中可能的数字。在10-99中 进行分析。 十位数不能为0,个数数可以为0但不能和十位数相同,所以10-99中符合条件的两位数就是 9 * 9 = 81个,那么在 n =2 的所有排列组合 就是 81 加 n = 1 时的排列组合 再加上n=0时的排列组合 81+9+1 = 91。
所以建立一个数组,存储该数位的可能数字。
比如 一个三位数:百位不能为0,就是9种,十位可以为0但是不能和百位相同,也是9种,个位数就是8种。
将所有位的排列组合都列出来 (题目给出n的范围是0-8)
建立数组 num = [1,9,9,8,7,6,5,4,3,2].。
完整代码
class Solution:def countNumbersWithUniqueDigits(self, n: int) -> int:num = [1,9,9,8,7,6,5,4,3,2]res = 0temp = 1for i in range(n+1):temp *= num[i]res +=tempreturn res