The set [1,2,3,…,n]
contains a total of n! unique permutations.
By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):
"123"
"132"
"213"
"231"
"312"
"321"
Given n and k, return the kth permutation sequence.
Note: Given n will be between 1 and 9 inclusive.
注意例子中的顺序,数小的在前。
n个值的排列有n!种,n - 1个值有(n - 1)!种,除去字符串首位,剩下的为n - 1位的排列,如123和132,除去1外就剩下两个数2,3,对其进行排列有23和32两种,即 (3-1)!种。 由此可得出第k个数的首位字符是多少,即 k / (n - 1)!, 比如 k = 5,那么可以得到第一位的index为2,即 数字3,接下来找第二位。 k = k % (n - 1)! 得出以3开头的里面排第几,然后用 k / (n - 2)! 来确定第二位的index,以此类推。
Source
public class Solution {
public String getPermutation(int n, int k) {
StringBuffer st = new StringBuffer(); //string 无append
if(n == 0) return st.toString();
int f = 1;
ArrayList<Integer> num = new ArrayList<Integer>();
k = k - 1; //下标从0开始 ***
for(int i = 1; i <= n ;i ++){
num.add(i);
}
for(int i = 1; i < n; i++){ //(n-1)!
f = f * i;
}
int kx = k;
int count = n;
while(count > 0){
int index = kx / f;
st.append(num.get(index));
num.remove(index); //***
kx = kx % f;
if((count - 1) != 0) f = f / (count - 1);
count --;
}
return st.toString();
}
}
Test
public static void main(String[] args){
System.out.println(new Solution().getPermutation(3, 5));
}