2022-04-11 「357. 统计各位数字都不同的数字个数」

今日中等题:https://leetcode-cn.com/problems/count-numbers-with-unique-digits/

一开始思路偏了,看到数字基数比较大,默认想从数量少的开始,就是先统计有重复位数的数字,后来发现这种方式,很容易有重复,而且一旦n的数量增加,会变得非常复杂。

所以换了个思维,直接统计不重复的数,会发现出了特殊的边缘值需要单独返回,100及以上的数的计算方式已经固定了:

  1. 首位不能为0,因此只有9种选择;
  2. 第二位开始可以选择的数字个数逐层减1;
  3. 因为0 <= n <= 8,所以不需要考虑没有数字可选的情况。

综上,看下代码吧,今天的思路和题解基本一致:

class Solution {
    public int countNumbersWithUniqueDigits(int n) {
        if (n==0) {return 1;}
        if (n==1) {return 10;}
        int ans = 10;
        int cur = 9;
        // 每增加1位数,可选数字范围比之前少1
        for (int i = 2; i <= n; i++) {
            cur = cur * (10-i+1);
            ans +=cur;
        }
        return ans;
    }
}

你可能感兴趣的:(2022-04-11 「357. 统计各位数字都不同的数字个数」)