题目:输入一个非负整数n,要求输出【0,10^n)之间的符合各位置无重复出现的数字的数个数。
思路:排列组合,1、特殊情况,n =0返回2;n=1返回10;2、当n大于2时,如n=5,(((6+1)*7+1)*8+1)*81+10;2、当n大于11时,11位之后的数必然存在重复的数字(装箱问题)。
public int countNumbersWithUniqueDigits(int n) {
switch(n){
case 0: return 1;
case 1: return 10;
default:
}
int res = 1, ct = 9-(n-2);
if(n >= 11) ct = 1;
while(ct < 9){
res *= ct++;
res += 1;
}
res *= 81;
res += 10;
return res;
}
770

被折叠的 条评论
为什么被折叠?



