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]
)
题目链接:357. Count Numbers with Unique Digits
算法描述:
由题意知,给定一个非负数 “n” ——表示数字的位数,我们将返回这个位数以内没有重复数字的个数。
我们可以统计规律,当位数为 “0” 时,返回1。当位数为 “1”时,我们知道 “0” 到 “9” 任何数都满足规律,返回10。
当位数大于等于 “2” 时,我们需要用排列组合的方法来求,当位数为 “n” 时,构造数的最高为可以选择除 “0” 以外的所有数,一共有9个,次高位可以选择除最高位的9个数,之后依次递减。所以,公式为 “9 * 9 * 8 * 7···· * ( 9 - n + 2 )”。当位数为 “n-1” 时,构造数的如上方法构造。·······
最后,我们返回 “n” 位数的构造数加上 “n-1” 位数的构造数,加上 “n-2” 位数的构造数····,加上 “1” 位数的构造数。
代码:
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
if(n == 0){
return 1;
}
if(n == 1){
return 10;
}
int temp = 9;
int ans = 10;
for(int i=2; i<=n; i++){
temp *= (9-i+2);
ans += temp;
}
return ans;
}
};