LeetCodeNo.60第k个

参考评论,我的思路和高赞评论基本一样,也是先确定第一个数,然后第二个数..
也是采用列表,计算索引,计算阶乘,更新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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值