题目传送地址:​​https://leetcode.cn/problems/permutation-sequence/​​​ 先给大家看一段用全排列的递归解法,但是不符合题目的性能要求。
代码:

public static String getPermutation(int n, int k) {
String[] allArrange = getAllArrange(n);
Arrays.sort(allArrange);
return allArrange[k - 1];
}

/**
* 全排列
*
* @param n
* @return
*/
public static String[] getAllArrange(int n) {
if (n == 1) {
String[] res = new String[1];
res[0] = "1";
return res;
}
List<String> list = new ArrayList<>();
String[] allArrange = getAllArrange(n - 1);
for (int i = 0; i < allArrange.length; i++) {
String str = allArrange[i];
for (int j = 0; j <= str.length(); j++) {
StringBuilder stringBuilder = new StringBuilder(str);
stringBuilder.insert(j, n);
list.add(stringBuilder.toString());
}
}
String[] res;
res = list.toArray(new String[0]);
return res;
}

真正厉害的代码是下面这样

public static String getPermutation(int n, int k) {
StringBuilder stringBuilder = new StringBuilder();
while (n > 0) {
stringBuilder.insert(0, n);
n--;
}
//比如n=4,则result=1234
return getResult(stringBuilder.toString(), k);
}

public static String getResult(String str, int k) {
//处理边界情况
if (str.length() == 1) {
return str;
}
int index = 0;
int factorial = doFactorial(str.length() - 1);
//计算出第一个字符 //比如n=4,k=9的情况下,本题的正确答案应该是"2314", factorial=6,
// 而9/6=1,经过下面的while循环以后,fisrtChar=2, k=3
while (k > factorial) {
index++;
k -= factorial;
}
if (k == 0 && index == 0) {
return str;
}
char firstChar = str.charAt(index);
String res = new StringBuilder(str).deleteCharAt(index).toString();
String result = getResult(res, k);
StringBuilder stringBuilder = new StringBuilder(result);
stringBuilder.insert(0, firstChar);
return stringBuilder.toString();
}

/**
* 阶乘
* @param m
* @return
*/
public static int doFactorial(int m) {
if (m == 1) {
return 1;
}
return doFactorial(m - 1) * m;
}

运行效率:

Leetcode60. 排列序列_while循环