题目
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
1、“123”
2、“132”
3、“213”
4、“231”
5、“312”
6、“321”
给定 n 和 k,返回第 k 个排列。
思想
本题是根据字典开排序的,以同一数字开头的字符串占总体字符传的比例相同,因此算出每个数字的字符串个数 j,可以通过 k / j 轻松推断出当前数字,下一个数字相当于对n-1个数字排序,选出其中第 k % j 字符串。。。就这样,可以一直计算到最后一位数字,返回此字符串即可。
代码
class Solution {
public String getPermutation(int n, int k) {
k = k - 1; //题中从一开始,我在里设为从零开始
List<Integer> list = new ArrayList<Integer>(); //用来按顺序保存前n个值
list.add(1);
int num = 1;
for(int i = 2; i <= n; i++){
num = num*i;
list.add(i);
}
String str = "";
int n1 = n; //返回的字符串长度为n
while(n1-- > 0){
if(list.size() > 0){ //list不为空才进行以下操作
int j = num / n; //num表示当前可供选择的字符串的数目,n表示当前数字个数,例如字符才能第一位有n个数字选择,第二位有n-1个数字选择,num/n表示每个数字所包含的字符串的数目
str = str + list.get(k/j);
list.remove(k/j); //添加完以后在list中移除此数
k = k % j; //选择完当前数字后,下一个数字在可供选择的字符串的排序变为k % j
num = num / n; //选择完当前数字后,下一个可供选择的字符串个数为num/n;
n--; //当前数字已选择,可用数字减一
}
}
return str;
}
}