文字讲解
代码
class Solution {
public:
// 计算排列数
int A(int a, int b) {
int ans = 1;
for (int i = a - b + 1; i <= a; i ++ ) ans *= i;
return ans;
}
int countSpecialNumbers(int n) {
vector<int> digits;
while (n) digits.push_back(n % 10), n /= 10;
// last统计已经填写的数字的状态
int ans = 0, last = 0;
for (int i = digits.size() - 1; i >= 0; i -- ) {
int x = digits[i];
// 最高位不可为0
for (int j = i == digits.size() - 1; j < x; j ++ ) {
// 如果当前数字已经被填写过, 则跳出本次循环[手写稿解释]
if (last >> j & 1) continue;
// [手写稿解释]
ans += A(10 - digits.size() + i, i);
}
// 如果当前数字x已经被填写过, 则退出循环, [手写稿解释]
if (last >> x & 1) break;
// 记录已填写的状态
last |= 1 << x;
// 判断数字n本身是否符合条件, 走到此, 就说明符合条件
if (!i) ans ++;
}
// 记录数字长度不足digits.size()的情况
for (int i = 1; i < digits.size(); i ++ )
// [手写稿解释公式]
ans += 9 * A(9, i - 1);
return ans;
}
};