2022年04月11日 力扣每日一题

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

提示:

  • 0 <= n <= 8
Related Topics
  • 数学
  • 动态规划
  • 回溯
  • 个人解法

    思路:

    今天这题在我看来就是一个排列组合的问题,首先我们先考虑下边界,

    • n == 0 时,只有一种结果,0

    • n == 1 时,0~9,共10种情况

    • 其他值:由两部分组成,满位的数(即首位不为0),以及比它少一位的全部情况

      • 考虑到首位不能为0,因此,首位只能是1~9
      • 接下来的位置,与前面的数字不能重复但是可以为0

      总体来说,首位不为0的情况,个数是9*9*8*。。。。

    class Solution {
        public int countNumbersWithUniqueDigits(int n) {
            if (n == 0) {
                return 1;
            }
            if (n == 1) {
                return 10;
            }
            int sub = 9;
            int count = 10;
            int mul = 9;
            for (int i = 2; i <= n; i++) {
                count += mul * sub;
                mul *= sub;
                sub--;
            }
            return count;
        }
    }
    class Solution:
        def countNumbersWithUniqueDigits(self, n: int) -> int:
            if n == 0:
                return 1
            if n == 1:
                return 10
            sub = 9
            count = 10
            mul = 9
            for i in range(2, n + 1):
                count += mul * sub
                mul *= sub
                sub -= 1
            return count