找规律,不要急着一簇而就,先用代码解决出首位是几,在数组中下标是几。然后就会发现每次的余数(下一轮首位确定后有多少组合)和乘数(当前首位确定后有多少种组合)是关键,慢慢解决思路就出来了。
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;}
}