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]
)
题目要求: 找出0到10的n次方中所有unique的数(既该数的所有位数无重复数组),如123为为unique,122不为unique,因为后两位2重复出现。
其实这个题的思路还是蛮简单的,回想下最简单的排列组合的知识。如找出所有十位unique digits number, 那么我们在十位可取1-9这九个数字,在个位能取除十位的数字外剩下的数字,由于个位可取0,所以个位还是可以取9个数字,则十位数的unique number为9*9 = 81。同理, 所有百位数unique digits number为9*9*8=648, 以此类推。
由于此题目要求返回0到10的n次方中所有的unique number个数,因此我们可以分别求出个,十,百...每个位数上分别对应的unique number个数,然后加起来就好了。(这么一说感觉和动态规划也没什么关系2333)
代码实现如下:
public int countNumbersWithUniqueDigits(int n) {
if (n < 0) {
return 0;
}
if (n == 0) {
return 1;
}
int result = 1;
for(int i = 1; i <= n; i++){
int count = 9;
int mult = 9;
int cur = i;
while (cur > 1) {
count *= mult;
mult--;
cur--;
}
result += count;
}
return result;
}