[leetcode] 357. Count Numbers wi
这道题的意思呢,是给我们一个整数n,算出大于等于0小于10的n次方的数中各位上不相同的数字的个数,说起来有些绕口哈。
举个实例:n = 1时,大于0小于10总共10个数(0-9),都满足这个条件,即个数为10
n = 2时,在0-99中共有 11,22,33,44,55,66,77,88,99, 9个数不满足条件, 即个数为91
通用公式:f(k) = 9 * 9 * 8 * ... (9 - k + 2)
网上关于这道题的解析很多,感觉对通用公式的解释都不够详细,我就主要做下这块的解释。
从n=2,开始分析 , 0 - 99 共100个数,分为两种
① 位数为1的,0-9 全部符合条件,即十个
② 位数为2的,十位数取值范围为1-9共9个,个位数取值范围为0-9共十个但由于不能与十位一致,所有减1,也为9,即9*9 = 81
此时答案为10+81=91个
n=3 一个道理,简单说下分三种情况,前两种情况即为n=2
① 位数为1的,0-9 全部符合条件,即十个
② 位数为2的,十位数取值范围为1-9共9个,个位数取值范围为0-9共十个但由于不能与十位一致,所有减1,也为9,即9*9 = 81
③位数为3的,百位数取值范围为1-9共9个,十位数取值为9,个位数取值为8
答案为10+9*9+9*9*8
最后,分享下我的算法
public int countNumbersWithUniqueDigits(int n) {
if (n == 0) return 1;
int res = 10;
int digits = 9;
for (int i = 9; i >= 11 - n; i--) {
digits = digits * i;
res = res + digits;
}
return res;
}