這道題其實可以通過給的n值知道一共有n!種組合,通過給的k值可以知道開頭第一位數字是多少,舉例來說,比如n的值是4,可以知道一共有24中組合方式(1234,1243,...,4321),如果k是14的話(寫代碼的時候k要減一操作),可以知道如果n是3的時候有6種組合,14/6=2可以知道,第一位的數字是3,這樣還剩下124在后三位,然后用14-26=2,可以知道新的k的值;
此時n就變成了三位數的排列組合,如果要判斷第二位數,此時用2/2=1,也就是說,第二位是1;
然后再次更新k=2-12 = 0,也就是說后面是按從小到大的順序,2,4,得到3124是第14個數,代碼如下:
public static String getPermutation(int n, int k) {
if (k <= 0) return null;
if (n <= 0) return null;
int num = 1;
List<Integer> numbers = new ArrayList<>();
int[] fac = new int[n+1];
fac[0] = 1;
String str = "";
//計算不同的n,組合的數量
for (int i = 1; i <= n; i++) {
num *= i;
fac[i] = num;//{1,1,2,6,24,...}
// System.out.println(fac[i]);
}
for (int i = 1; i <= n; i++) {
numbers.add(i);
}
k--;
for (int i = 1; i <= n; i++) {
int first = k/fac[n-i];//計算是幾開頭的數
str = str + Integer.toString(numbers.get(first));
// System.out.println(str);
numbers.remove(first);
k = k - first * fac[n-i];
}
return str;
}