参考评论,我的思路和高赞评论基本一样,也是先确定第一个数,然后第二个数..
也是采用列表,计算索引,计算阶乘,更新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();
}
}
来源:CSDN
作者:零分分分分
链接:https://blog.csdn.net/qq_33399567/article/details/103662987