当前位置: 代码迷 >> 综合 >> leetcode(力扣) 357. 统计各位数字都不同的数字个数 (排列组合)
  详细解决方案

leetcode(力扣) 357. 统计各位数字都不同的数字个数 (排列组合)

热度:12   发布时间:2023-12-26 10:58:38.0

文章目录

  • 题目描述
  • 简化题目
  • 思路分析
  • 完整代码

题目描述

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