LeetCodeNo.60第k个

依然范特西╮ 提交于 2020-02-01 09:01:38
参考评论,我的思路和高赞评论基本一样,也是先确定第一个数,然后第二个数..
也是采用列表,计算索引,计算阶乘,更新k值,更新列表。但是我的不足很多:
1、打算采用递归来做,递归函数参数选用(不断更新的list,n-1,变化的k值)
但发现不需要采用递归,应该类似for循环递推
2、求解阶乘;打算写一个阶乘函数,一直调用函数,却发现可以直接一次计算所有
阶乘,放入数组,需要的时候直接拿
3、确定索引和改变的k值,是通过计算k/阶乘的余数是否为0,来分类
int curFactorial=factorials[n-1];
int index=(k%curFactorial!=0)?k/curFactorial+1:k/curFactorial
然后发现计算k值的时候也要分类,大大麻烦。参考的解答里面很巧妙,先k-1,
再计算index和k都很方便,需要继续体会
4、list的使用不熟练  
list.remove(index)  这行代码不仅删除了元素,同时拿到了删除的元素,
remove方法是有返回值的,返回的就是被删除的元素,不需要事先用get(index)
方法。
5、在一个for循环里同时干两件事:创建list,计算阶乘,我一开始放在两个for循环,代码冗余同时耗费不必要时间。

class Solution {
    public String getPermutation(int n, int k) {
        StringBuilder result=new StringBuilder();
        int[] factorials=new int[n+1];
        factorials[0]=1;
        List<Integer> list=new ArrayList<>();
        for(int i=1;i<=n;i++){
            factorials[i]=i*factorials[i-1];
            list.add(i);
        }
        k-=1;
        for(int i=n-1;i>=0;i--){
            int index=k/factorials[i];
            result.append(list.remove(index));
            k-=index*factorials[i];
        }
        return result.toString();
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!