题目大意
给出一个整数n,求在范围 [0,10n) 内每一位数都不相同的数字数目,如n=2时,返回91,除去 {11,22,33,44,55,66,77,88,99} 这几个数字。
解题思路
将第n次迭代的结果与第n-1次迭代的结果联系起来,给一个例子帮助理解:
当n=3,求
[0,1000)
里每一位数都不相同的数字数目,假设已知n=2的时候的结果,即
[0,100)
区间里面的结果是91,那么只需要求
[100,1000)
区间的结果即可。要求
[100,1000)
区间的结果,首先这个区间的数字都是3位数,将这些数字拆分成3位考虑。第一位的可能有9种(第一位的数字不能是0),剩下的位数的可能结果可以用
A29
求得。即
f(3)=f(2)+9∗A29
。
归纳递归公式:
f(n)=f(n−1)+9∗An−19
代码
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
if (n == 0) {
return 1;
}
const int tableSize = n;
int statusTable[tableSize];
statusTable[0] = 10;
for (int i = 1; i < n; i++) {
statusTable[i] = 9 * permutation(9, i) + statusTable[i - 1];
}
return statusTable[n - 1];
}
private:
int permutation(int under, int up) {
int result = 1;
for (int i = 0; i < up; i++) {
result *= under--;
}
return result;
}
};