LeetCode 60题
这个题也写的很漂亮的,想+写+debug,两个多小时
class Solution {
public String getPermutation(int n, int k) {
StringBuilder sb = new StringBuilder();
List<Integer> list = new ArrayList<>();
for(int i = 0; i < n; i++){
list.add(i+1);
}
dfs(n, k, sb, list);
return sb.toString();
}
public void dfs(int n, int k, StringBuilder sb, List<Integer> list){
if(k == 1){
while(list.size() > 0){
sb.append(list.remove(0));
}
return;
}
if(k == 0){
while(list.size() > 0){
sb.append(list.remove(list.size()-1));
}
return;
}
int factorial = mutipy(n-1);
int remainder = k % factorial;
int index = k / factorial;
if(remainder == 0){
index--;
}
sb.append(list.remove(index));
dfs(n-1, k - factorial*index, sb, list);
}
public int mutipy(int n){
int res = 1;
for(int i = 1; i < n; i++){
res += res * i;
}
return res;
}
}
补个面试的时候,想到的做法
一个stringbuilder存123456这种原始字符串,另一个stringbuilder存结果字符串。在遍历的时候,算出每一次遍历时,应该取那个字符,就将原始字符串里面的字符取到结果字符串中
class Solution {
StringBuilder sb = new StringBuilder();
StringBuilder resSb = new StringBuilder();
public String getPermutation(int n, int k){
for(int i = 0; i < n; i++){
sb.append(i+1);
}
dfs(n, k, sb);
return resSb.toString();
}
public void dfs(int n, int k, StringBuilder temp){
if(temp.length() == 1 || k == 0 || k == 1){
resSb.append(temp);
return;
}
int num = cal(n - 1);
int res = k / num;
int args = k % num;
if(args == 0){
resSb.append(sb.charAt(res-1));
sb.deleteCharAt(res-1);
}else{
resSb.append(sb.charAt(res));
sb.deleteCharAt(res);
}
if(args == 0){
dfs(n-1, k-((res-1)*num), temp);
}else{
if(res == 1){
dfs(n-1, k-num, temp);
}else {
dfs(n-1, k-(res*num), temp);
}
}
}
public int cal(int num){
if(num == 0){
return 1;
}
int res = 1;
for(int i = num; i > 1; i--){
res = res * i;
}
return res;
}
}
结果