在n个数字升序全排列的数组中找到下标为k-1的那个数
从数字的最高位,一位一位的找出第k个数字的每一位
新建一个数组,从1到n,升序,把这些数字放到数组中
先找第一位,在1到n这些数字中,从这个n个数字的每一个数字开头的数的个数有(n-1)!个
那么,第k个数字的第一位为 k-1/(n-1)!,得到的数为第一位数字在数组中的下表 index
第二位,的问题又变成了, 在n-1个数字升序全排列的数组中找到下标为k-1-(n-1)!* index的那个数.
由第二位的规律,可以推算出每一位的值。java代码为:
class Solution {
public String getPermutation(int n, int k) {
//相当于n个数字全排列的数组,找到下标为k-1的那个数
k = k-1;
//0到n-1位置的阶乘数组
int[] factorial = new int[n];
factorial[0] = 1;
for(int i =1;i<n ;i++){
factorial[i] = factorial[i-1]*i;
}
//把所有的数都放在数组中,供使用(不放回的取出)
List<Integer> list = new LinkedList<>();
for(int i=1;i<=n;i++){
list.add(i);
}
StringBuilder stringBuilder = new StringBuilder();
for(int i = n-1;i>=0;i--){
int index = k/factorial[i];
stringBuilder.append(list.remove(index));
k = k - index * factorial[i];
}
return stringBuilder.toString();
}
}