给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n 。
示例:
输入: 2
输出: 91
解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字。
//总结:排列问题只有两种代码,一种是八皇后的那种代码,一种是for(i:1~9);
//代码1:总结,可以直接从头开始res++,看成是1到pow(10,n)-1之间有多少个符合要求的数字。
class Solution {//注意是都不同
// 排列组合
int res;
int n;
public int countNumbersWithUniqueDigits(int n) {
this.n=n;
if(n==0) return 1;
int[] vis=new int[10];
backtrack(0,vis);
return res+1;//因为n=1的时候少一个0;所以加1
}
public void backtrack(int index,int[] vis){
if(index==n){
return ;
}
for(int i=0;i<=9;i++){
if(vis[i]==1) continue;
if(i==0 && index==0) continue;
vis[i]=1;
res++;
backtrack(index+1,vis);
vis[i]=0;
}
}
}
class Solution {//注意是都不同
// 排列组合
int[] ans;
public int countNumbersWithUniqueDigits(int n) {
if(n==0) return 1;
ans=new int[n+1];
ans[0]=1;
int[] vis=new int[10];
for(int i=1;i<=n;i++){
backtrack(i,0,vis);
}
int res=0;
for(int num:ans) res+=num;
return res;
}
public void backtrack(int bit, int index,int[] vis){
if(index==bit){
ans[bit]++;
return ;
}
for(int i=0;i<=9;i++){
if(i==0 && index==0) continue;
if(vis[i]==1) continue;
vis[i]=1;
backtrack(bit,index+1,vis);
vis[i]=0;
}
}
}
class Solution {//注意是都不同
public int countNumbersWithUniqueDigits(int n) {
if(n==0) return 1;
int[] ans=new int[n+1];
ans[1]=10;
for(int i=2;i<=n;i++){
ans[i]=9;
int num=9;
while(num+i>=11){
ans[i]=ans[i]*num;
num--;
}
}
int res=0;
for(int i=1;i<=n;i++){
res+=ans[i];
}
return res;
}
}