Leetcode60. Permutation Sequence
这题和剑指上的Permutation其实是一道题。
按顺序输出第k个排序即可。
而给了n和k,这个排序其实已经确定了,如给定n=4,k=9:
k-=1 -> k=8(因为从0开始)
8/3! = 1
8%3! = 2
2/2! = 1
2%2! =0
即1234先变成2134,134在变成213即最终输出2314 。
这里需要注意,这里的顺序和剑指不太一样,剑指因为没有要求输出顺序,所以直接swap即可,而这里的swap交换后也要是有序的。
class Solution {
public String getPermutation(int n, int k) {
if(n==1) return "1";
k=k-1;
char[] ans = new char[n];
for(int i=0;i<n;i++) ans[i] = (char)(i+'1');
int index = 0;
int delta = 0;
int factor = factorial(n-1);
while(k!=0){
delta = k/factor;
swap(ans,index,index+delta);
k = k%factor;
factor/=(n-1-index);
index++;
}
return new String(ans);
}
private int factorial(int a){
if(a==1) return 1;
return a*factorial(a-1);
}
private void swap(char[] chars,int a,int b){
if(a==b) return;
char temp = chars[b];
for(int i=b;i>a;i--) chars[i]=chars[i-1];
chars[a]=temp;
}
}
Runtime: 5 ms, faster than 100.00% of Java online submissions for Permutation Sequence.
Memory Usage: 37.4 MB, less than 43.90% of Java online submissions for Permutation Sequence.

浙公网安备 33010602011771号