1. 程式人生 > >[LeetCode] 357. Count Numbers with Unique Digits

[LeetCode] 357. Count Numbers with Unique Digits

1-1 git 不可 意思 沒有 找規律 lan input 其他

Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n.

Example:

Input: 2
Output: 91 
Explanation: The answer should be the total numbers in the range of 0 ≤ x < 100, 
             excluding 11,22,33,44,55,66,77,88,99

題意:從0至10的n次方中 沒有重復數字的數 的個數
比方說:100以內重復的有11,22,33。。。99,也就是說100 - 9 等於91;
這100個數字是有0,沒有100的;
正向思維,找規律,計算所有重復的,然後減去這個值,
比方說:100 - 9 = 91;
如果是 n為3的話,100以內已經確定了9個,100 - 200 內(不包括200),有18個,不考慮首位,00,11,22,33,,,99,有10個,考慮首位,11x有10個,1x1有10個去兩次(3位數-1)111,
依次可以找規律,有興趣的同學可以自己解一下
這裏我沒有解,因為列邊界條件時,我想到了一些其他東西分享給大家
n為非負整數,n為0 是返回1 n為1時返回10,
0-9只有10個數字,也就是說n>=10時返回的結果是一樣的,其二這裏的n是指10的n次方
那麽可以延伸出另一層意思,是個n位數以內的解法,求不重合數字的個數
那麽,我們直接拿概率論解
2位數 9*9 + 9 + 1; 首位不可能為0,那麽滿位情況的數量就是9*9,少位情況下就是9,+1特指0;
3位數 9*9*8 + 9*9 + 9 +1 同理上面,首位不可能為0,滿位情況就是9*9*8,少一位9*9,接著9,最後+1,漏掉的0;
那麽解法就比較明顯了
public int countNumbersWithUniqueDigits(int n) {
        if (n == 0)
            return 1;
        if (n == 1)
            return 10;
        if (n >= 10)
            n 
= 10; int sum = 0; int num = 1; for (int i = 0; i < n; i++) { num = 9; int k = i + 1; for (int j = 9; j > 0 && k < n; j--, k++) { num *= j; } sum += num; } return sum + 1; }

[LeetCode] 357. Count Numbers with Unique Digits