60. Permutation Sequence

선택한 UI 언어에 맞게 문제 텍스트를 러시아어에서 번역합니다. 코드는 변경하지 않습니다.

Множество [1, 2, 3, ..., n] содержит в общей сложности n! уникальных перестановок.

Списком и маркировкой всех перестановок по порядку, мы получаем следующую последовательность для n = 3:

"123"

"132"

"213"

"231"

"312"

"321"

given n и k, return 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++ 해법

자동 초안, 제출 전 검토
#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).

Используйте коэффициенты факториалов для построения перестановки.

return строку перестановки.

😎

Vacancies for this task

활성 채용 with overlapping task tags are 표시됨.

전체 채용
아직 활성 채용이 없습니다.