第k个排列(Java)

题目

给出集合 [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 字符串。。。就这样,可以一直计算到最后一位数字,返回此字符串即可。
leetcode击败百分之八十多的用户嘿嘿

代码

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;    
    }
}
发布了35 篇原创文章 · 获赞 2 · 访问量 955

猜你喜欢

转载自blog.csdn.net/y18771025420/article/details/103425724