60. Permutation Sequence
Множество [1, 2, 3, ..., n] содержит в общей сложности n! уникальных перестановок.
Списком и маркировкой всех перестановок по порядку, мы получаем следующую последовательность для n = 3:
"123"
"132"
"213"
"231"
"312"
"321"
Дано n и k, верните k-ю перестановку последовательности.
Пример:
Input: n = 3, k = 3
Output: "213"
C# решение
сопоставлено/оригиналpublic class Solution {
public string GetPermutation(int n, int k) {
int[] factorials = new int[n];
List<char> nums = new List<char>() { '1' };
factorials[0] = 1;
for (int i = 1; i < n; ++i) {
factorials[i] = factorials[i - 1] * i;
nums.Add((char)(i + 1 + '0'));
}
k--;
StringBuilder result = new StringBuilder();
for (int i = n - 1; i > -1; --i) {
int idx = k / factorials[i];
k -= idx * factorials[i];
result.Append(nums[idx]);
nums.RemoveAt(idx);
}
return result.ToString();
}
}
C++ решение
auto-draft, проверить перед отправкой#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public string GetPermutation(int n, int k) {
vector<int>& factorials = new int[n];
List<char> nums = new List<char>() { '1' };
factorials[0] = 1;
for (int i = 1; i < n; ++i) {
factorials[i] = factorials[i - 1] * i;
nums.push_back((char)(i + 1 + '0'));
}
k--;
StringBuilder result = new StringBuilder();
for (int i = n - 1; i > -1; --i) {
int idx = k / factorials[i];
k -= idx * factorials[i];
result.Append(nums[idx]);
nums.RemoveAt(idx);
}
return result.ToString();
}
}
Java решение
сопоставлено/оригиналclass Solution {
public String getPermutation(int n, int k) {
int[] factorials = new int[n];
List<Integer> nums = new ArrayList() {{
add(1);
}};
factorials[0] = 1;
for (int i = 1; i < n; ++i) {
factorials[i] = factorials[i - 1] * i;
nums.add(i + 1);
}
--k;
StringBuilder sb = new StringBuilder();
for (int i = n - 1; i > -1; --i) {
int idx = k / factorials[i];
k -= idx * factorials[i];
sb.append(nums.get(idx));
nums.remove(idx);
}
return sb.toString();
}
}
JavaScript решение
сопоставлено/оригиналvar getPermutation = function (n, k) {
let factorials = new Array(n);
let nums = ["1"];
factorials[0] = 1;
for (let i = 1; i < n; ++i) {
factorials[i] = factorials[i - 1] * i;
nums.push((i + 1).toString());
}
--k;
let output = "";
for (let i = n - 1; i > -1; --i) {
let idx = Math.floor(k / factorials[i]);
k -= idx * factorials[i];
output += nums[idx];
nums.splice(idx, 1);
}
return output;
};
Python решение
сопоставлено/оригиналclass Solution:
def getPermutation(self, n: int, k: int) -> str:
factorials, nums = [1], ["1"]
for i in range(1, n):
factorials.append(factorials[i - 1] * i)
nums.append(str(i + 1))
k -= 1
output = []
for i in range(n - 1, -1, -1):
idx = k // factorials[i]
k -= idx * factorials[i]
output.append(nums[idx])
del nums[idx]
return "".join(output)
Go решение
сопоставлено/оригиналfunc getPermutation(n int, k int) string {
factorials := make([]int, n)
nums := make([]string, n)
factorials[0] = 1
nums[0] = "1"
for i := 1; i < n; i++ {
factorials[i] = factorials[i-1] * i
nums[i] = strconv.Itoa(i + 1)
}
k = k - 1
var output strings.Builder
for i := n - 1; i > -1; i-- {
idx := k / factorials[i]
k -= idx * factorials[i]
output.WriteString(nums[idx])
nums = append(nums[:idx], nums[idx+1:]...)
}
return output.String()
}
Algorithm
1️⃣
Сгенерируйте входной массив nums чисел от 1 до N.
2️⃣
Вычислите все факториальные основы от 0 до (N−1)!.
3️⃣
Уменьшите k на 1, чтобы значение попало в интервал (0, N!−1).
Используйте коэффициенты факториалов для построения перестановки.
Верните строку перестановки.
😎
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.
Активных вакансий пока нет.