[LeetCode] 357. Count Numbers with Unique Digits
阿新 • • 發佈:2018-09-25
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, excluding11,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