#60第K个排列medium


#60medium
code1:
class Solution {
    public String getPermutation(int n, int k) {
        List<Integer> num = new ArrayList<>();
        for (int i = 1; i <= n; i++) num.add(i);
        int[] factorial = new int[n];
        factorial[0] = 1;
        for (int i = 1; i < n; i++) factorial[i] = i * factorial[i-1];
        n--;
        StringBuilder res = new StringBuilder();
        while (n >= 0){
            int t = factorial[n];
            int loc = (int) (Math.ceil((double) k / (double) t)) - 1;
            if (loc == -1) loc = num.size() - 1;
            res.append(num.get(loc));
            num.remove(loc);
            k %= t;
            n--;
        }
        return res.toString();
    }
}

code2:
class Solution {
    public String getPermutation(int n, int k) {
        StringBuilder sb = new StringBuilder();
        //阶乘数组
        int[] factorials = new int[n];
        //注意0和1的阶乘为1
        factorials[0] = 1;
        //阶乘值为当前值乘前一个阶乘值
        for(int i = 1; i < n;i++){
            factorials[i] = i * factorials[i-1];
        }
        //list存储“数字”,因此remove后依旧有序,无需排序。
        //这保证了我们只要知道需要获取值的偏移量就可以得到对应的值。
        List<Character> nums = new ArrayList<>();
        for(int i = 1; i <= n;i++){
            nums.add((char)(i+48));
        }
        int index;
        //将题目的人类习惯奇数改为list内部下标计数。
        k--;
        //最差情况下从第一位一直运算到第n-1位,最后一位便是剩下的。
        for(int j = 1;j < n;j++){
            int factorial = factorials[n-j];
            //获取该位“数字”在list内的下标
            index = k / factorial;
            k = k % factorial;
            //将这一位“数字”加进来后从list内部删除该“数字”
            sb.append(nums.get(index));
            nums.remove(index);
            //如果此时不再有相对偏移量,退出循环。
            if(k == 0){
                break;
            }
        }
        //如果最差情况,此时将最后一位加进来,
        //如果中途因为刚好匹配、没有偏移量而退出则按序将剩余“数字”加进来。
        while (nums.size()>0){
            sb.append(nums.get(0));
            nums.remove(0);
        }
        return sb.toString();
    }
}

code3:
class Solution {
    public String getPermutation(int n, int k) {
        StringBuilder res=new StringBuilder();
        String num="123456789";
        int[] f=new int[n];
        for(int i=0;i<n;i++) f[i]=1;
        for(int i=1;i<n;i++)
            f[i]=f[i-1]*i;
        --k;
        for(int i=n;i>=1;--i){
            int j=k/f[i-1];
            k %=f[i-1];
            res.append(num.charAt(j));
            num=num.replace(num.substring(j,j+1),"");
        }
        return res.toString();
    }
}

上一篇:Longest Substring Without Repeating Characters--Medium


下一篇:leetcode 1-100 medium难度题目汇总