题目:
题意: 给出n,求出在0到 10 ^ n 次方之间的各位各不相同的数。
思路: 相当于求n+1位,每位各不相同的数的个数。
当n = 1时,这一位有10 中选择
当n = 2时,第一位有9种选择(不能选择0),此时第二位也有9种选择。所以当数为两位数时有9 * 9种可能,但是因为数是在[0,100)之间,所以要加上当数只有一位数字的情况,即9 * 9 + 10;
当n = 3时,第一位9种,第二位9种,第三位8种,所以数为3位时的个数是9 * 9 * 8,此时再加上数为2位和数为1位时的数即前面求出n = 2时的值,所以 = 9 * 9 * 8 + nums[2]
类似于一种排列组合问题
具体代码如下:
public class Solution {
public int countNumbersWithUniqueDigits(int n) {
if(n == 0){
return 1;
}
int[] nums = new int[n+1];
nums[1] = 10;
for(int i = 2; i<=n;i++){
int p = i;
int flag = 2;
int num = 1;
int re = 1;
while(p >=1){
if(flag > 0){
re *= 9;
flag--;
}else{
re *=(9-num);
num++;
}
p--;
}
nums[i] = re +nums[i-1];
}
if(n>10){
return nums[10];
}
return nums[n];
}
}