Permutation Sequence
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.
Analysis
举例:n=3, k=5
- 得到factorial[] = {1,1,2} (算n!,方便后面使用)
 - 得到numbers = {1,2,3} (用来加到string里面去的元素)
 - k--: k=4
 - while循环i从1到3
- i=1
- (3-1)!=2, 加上第一个数以后,有两种变换方法
 - 4/2 = 2,加入numbers[2]=3(注意这里k要减一)
 - 从numbers里除去numbers[2],numbers变为{1,2}
 - 4减去2*2 = 0,下一个问题中的第0顺位
 
 - i=2
- (3-2)!=1
 - 0/1=0, 加入numbers[0]=1
 - 移除number[0], numbers = {2}
 - 0减去1*0 = 0
 
 - i=3
- (3-3)!=1
 - 0/1=0, 加入numbers[0]=2
 - 移除numbers[0],numbers变为{}
 - 0减去1*0=0
 
 
 - i=1
 
Code
public class Solution {
    public String getPermutation(int n, int k) {
        List<Integer> numbers = new ArrayList<Integer>();
        int[] factorial = new int[n+1];
        StringBuilder sb = new StringBuilder();
        //create an array of factorial lookup
        int sum = 1;
        factorial[0]=1;
        for(int i=1; i<=n; i++){
            sum *= i;
            factorial[i] = sum;
        }
        //factorial[] = {1,1,2,6}
        for (int i=1; i<=n; i++){
            numbers.add(i);
        }
        //numbers = {1,2,3}
        k--;
        for(int i=1; i<=n; i++){
            int index = k/factorial[n-i];
            sb.append(String.valueOf(numbers.get(index)));
            numbers.remove(index);
            k -= factorial[n-i]*index;
        }
        return sb.toString();
    }
}
Note
- stringBuilder.append(string)
 - ArrayList.get(index)
 - String.valueOf(object)
 - ArrayList.remove(index)
 - stringBuilder.toString()