Набор [1,2,3,…, n] содержит всего n! уникальные перестановки.
Перечислив и пометив все перестановки по порядку, мы получим следующую последовательность (т. Е. Для n = 3):
- "123"
- "132"
- "213"
- "231"
- "312"
- "321" Для заданных n и k вернуть k-ю последовательность перестановок.
Например, если n = 3, k = 4, ans = "231".
Есть несколько решений. Но все они используют либо факториал, либо сложность больше, чем O (n), например O (n!). Если вы используете факториал и найдете число в позиции k / (n-1) !, проблема возникает, когда n велико (n = 100). Здесь, поскольку n большое, (n-1)! переполняется и становится 0. В результате я получаю ошибку деления на ноль ... какое-либо решение или алгоритм для этого?
Вот мой код:
public class KthPermutation {
public String getPermutation(int n, int k) {
// initialize all numbers
ArrayList<Integer> numberList = new ArrayList<Integer>();
for (int i = 1; i <= n; i++) {
numberList.add(i);
}
int fact = 1; // set factorial of n-1
for (int i = 1; i <= n-1; i++) {
fact = fact * i;
}
if ((long) k > (long) fact * n) {
k = (int) ((long) k - (long) (fact * n));
}
k--; // set k to base 0
StringBuilder result = new StringBuilder();
result = getP(result, numberList, n, k, fact);
return result.toString();
}
public static StringBuilder getP(StringBuilder result,
ArrayList<Integer> numberList, int n, int k, int fact) {
if (numberList.size() == 1 || n == 1) {
result.append(numberList.get(0));
return result; // return condition
}
int number = (k / fact) + 1 ;
result.append(numberList.get(number - 1));
numberList.remove(number - 1);
k = k % fact; // update k
fact = fact / (n - 1);
n--;
return getP(result, numberList, n, k, fact);
}
}
BigInteger
или что-то в этом роде; Я не уверен, что ваш код правильный. Не могли бы вы объяснить, почему вы используетеfact*n
? А что такое база 0? - person G. Bach   schedule 04.07.2015k := k mod n!
, я вижу. Вы пробовали использовать BigInteger? При ближайшем рассмотрении ваш код кажется мне правильным, за исключением того, что он не проверяет, являются ли n или k неположительными, k больше 2 * n !, и целочисленное переполнение. - person G. Bach   schedule 04.07.2015