LeetCode 计算各个位数不同的数字个数

给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n 。

示例:

输入: 2
输出: 91 
解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字。

思路分析:使用递归算法,和数学上的排列即可。

class Solution {
public:
    int countNumbersWithUniqueDigits(int n) {
        if (n == 0){//当n == 0时只有[0]
            return 1;
        }
        else if (n == 1){//当n == 1时,只有[0, 1, 2, ... 9]
            return 10;
        }
        else if (n > 10){//因为只有0 ~ 9共十个数字,当n超过十必定会有重复数字
            return countNumbersWithUniqueDigits(10);
        }
        else{
            //対长度为n的数字进行排列,
            //第一个数字只能填充[1,9],9种情况
            //第二个数字能填充[0,9]但是需要去掉第一位填充的数字,9种情况
            //第三个数字能填充[0,9]但是需要去掉前两位已经使用了的数字,8种情况
            //....一次类推
            int tempRes = 9, cnt = 9;//cnt表示剩余的数字
            for (int index = n - 1; index > 0; --index){
                tempRes *= cnt--;
            }
            //排列完长度为n的数字,还需要排列长度为n-1位的数字
            return tempRes + countNumbersWithUniqueDigits(n - 1);
        }
    }
};

LeetCode 计算各个位数不同的数字个数_第1张图片
当然也可以直接使用递推

class Solution {
public:
    int countNumbersWithUniqueDigits(int n) {
        if(n==0) return 1;
        if(n==1) return 10;
        int val = 9, ans = 10;
        for(int i = 2; i <= n; i++)//対位数进行穷举
        {
        //val为长度为i - 1数字的个数
            val *= (9-i+2);
            ans += val;
        }
        return ans;
    }
};

你可能感兴趣的:(LeetCode)