//递归确定所在层数,相当简洁和快速的写法
private boolean[] mark=null;
private int[] data=null;
public String getPermutation (int n, int k) {
// write code here
data=new int[n+1];
mark=new boolean[n+1];
data[0]=1;
for (int i = 1; i < data.length; i++) {
data[i]=data[i-1]i;
}
return getRes("", k,data.length-1);
}
public String getRes(String pre,int k,int z) {
if(k==0) {
for (int i = 1; i < mark.length; i++) {
if(!mark[i]) {
pre=pre+i;
}
}
return pre;
}
if(data[z]==k) {
return eqq(z, pre);
}else if(k<data[z]){
int item=(k-1)/data[z-1]+1;
int sum=0;
for (int j = 1; j < mark.length; j++) {
if(!mark[j]) {
sum++;
if(item==sum) {
mark[j]=true;
return getRes(pre+j, k-(item-1)
data[z-1],z-1);
}
}
}
}
return "";
}
public String eqq(int i,String pre) {
if(i==1||i==0) {
for (int j = 1; j<mark.length; j++) {
if(!mark[j]) {
pre=pre+j;
}
}
return pre;
}
int len=0;
for (int j = 1; j < mark.length; j++) {
if(!mark[j]) {
len++;
}
}
//System.out.println(len);
int sum=len-i;
for (int j = 1; j < mark.length&&sum>0; j++) {
if(!mark[j]) {
sum--;
pre=pre+j;
mark[j]=true;
if(sum==0) {
break;
}
}
}
for (int j = mark.length-1; j>=1; j--) {
if(!mark[j]) {
pre=pre+j;
}
}
return pre;
}