找规律,不要急着一簇而就,先用代码解决出首位是几,在数组中下标是几。然后就会发现每次的余数(下一轮首位确定后有多少组合)和乘数(当前首位确定后有多少种组合)是关键,慢慢解决思路就出来了。
public String getPermutation(int n, int k) {
//记录1到n的累乘,每个都代表对应的组合数
int[] ms = new int[n];
//记录1到n,集合便于删除操作
List<Integer> na = new ArrayList<>(n);
//乘数放入数组, 数字放入集合
int m = 1;
for (int i = 1; i <= n; i++) {
na.add(i);
m = m * i;
ms[i - 1] = m;
}
String str = "";
//关键点,k取模再除组合数就可以计算每位的下标
for (int j = ms.length - 1; j > 0; j--) {
int i;
if(k % ms[j - 1] == 0) {
i = k / ms[j - 1] - 1;
k = ms[j - 1];
} else {
i = k / ms[j - 1];
k = k % ms[j - 1];
}
str+= na.remove(i);
}
str+= na.remove(0);
return str;
}
}