您好,登錄后才能下訂單哦!
357. Count Numbers with Unique Digits
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n.
Example:
Given n = 2, return 91. (The answer should be the total numbers in the range of 0 ≤ x < 100, excluding [11,22,33,44,55,66,77,88,99]
)
Hint:
A direct way is to use the backtracking approach.
Backtracking should contains three states which are (the current number, number of steps to get that number and a bitmask which represent which number is marked as visited so far in the current number). Start with state (0,0,0) and count all valid number till we reach number of steps equals to 10n.
This problem can also be solved using a dynamic programming approach and some knowledge of combinatorics.
Let f(k) = count of numbers with unique digits with length equals k.
f(1) = 10, ..., f(k) = 9 * 9 * 8 * ... (9 - k + 2) [The first factor is 9 because a number cannot start with 0].
題目大意:
找出10的n次方內,沒有重復數字的數的個數。例如10的3次方內,102為合法值,101為非法值。
思路:
采用排列組合來求出10的i次方,比如10的平方,范圍為[1,100),然后找出這個范圍內合法值有幾個。9*9(第一位不能為0,所以為9,第二位可以為除了第一位以外的9中情況)。
n次方 | 范圍 | 合法個數 |
0 | [0,1) | 1 |
1 | [1,10) | 9 |
2 | [10,100) | 9*9 |
3 | [100,1000) | 9*9*8 |
... | ... | ... |
i(i<9) | [10的i-1次方,10的i次方) | 9*9*8*7*...*(9 - n + 2) |
9 | [100000000,1000000000) | 9*9*8*7*6*5*4*3*2 |
經過上面分析,當n大于等于10的時候,合法值不再增加,因為n>=10時,數的位數超過了10位,所以肯定有重復的數字。
代碼如下:
class Solution { public: int countNumbersWithUniqueDigits(int n) { int result,tmp; if(0 == n) return 1; if(1 == n) return 10; result = 10; tmp = 9; for(int i = 2; i<=min(n,9); ++i) { result += tmp * (11 - i); tmp *= (11 - i); } return result; } };
2016-09-01 18:45:28
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。