题目是Permutation Sequence 这道题其实和前面的很多题都是类似,一开始我的想法是要用回溯法把字符串全部生成然后取第K个,其实这样很明显会超时,尤其是在遇到查找第K个的时候一般都是不用全部生成的,直接生成对应的字符串即可。这个题目很好找规律,然后从高位到低位依次生成即可。但是我一开始是用boolean数组判断重复,boonlean数组在判断重复上很有用,但是这道题boolean数组不是最好的选择,因为要不断的从剩余的元素中从前往后历遍,这时使用ArrayList是更好地选择,因为用过的数字从中删掉即可!这样历遍非常方便。
下面提一下StringBuilder, 这个主要是对字符串的连接,比直接对String的操作速度快,添加的方法为append,删除为deleteCharAt(i) 具体的使用将来再做一总结。
public class Solution {
private int getmuti(int n){
int res=1;
for(int i=1;i<=n;i++){
res=res*i;
}
return res;
}
public String getPermutation(int n, int k) {
boolean[] sa = new boolean[n+1];
String res = "";
LinkedList<String> l = new LinkedList<String>();
for(int i=1;i<=n;i++){
l.add(""+i);
}
if(n==0)
return res;
if(n==1)
return "1";
for(int i=n;i>1;i--){
int tmp = getmuti(i-1);
int shang = k/tmp;
int yu = k%tmp;
if(k==0)
shang=l.size();
if(yu==0)
shang--;
String shu = l.get(shang);
l.remove(shang);
res+=shu;
k=yu;
}
String shu = l.get(0);
//l.remove(shang);
res+=shu;
return res;
}
}