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]
)
class Solution {
// 摆明了是一道数学题了
// f(1) = 0,1,2,,,9
// f(2) = 9*9 1-9和1-9搭配产生unique digit
// f(3) = f(2)*8 已经有了两个数字了,还想unique 只有8个数字了
// f(4) = f(3)*7
// .......
// f(9) = 9*9*8*7*6*5*4*3*2*1
// f(10) = f(11) = f(12) = ..... = 0 聪明的你还想不到吗?
// O(1) Time
public int countNumbersWithUniqueDigits(int n) {
int res = 0;
if (n == 0) {
return 1;
}
for (int i = 1; i <= n; i++) {
res += f(i);
}
return res;
}
public int f(int i) {
if (i == 1) {
return 10;
}
else if (i == 2) {
return 81;
}
if (i >= 10) {
return 0;
}
return f(i - 1)*(11 - i);
}
}