第k个排列
题目描述
给定参数n, 从1到n会有n个整数: 1,2,3,…,n,这n个数字共有n!种排列.
按大小顺序升序列出所有排列的情况, 并一一标记,
当n=3时, 所有排列如下:
"123", "132" "213" "231" "312" "321"
给定n和k, 返回第k个排列.
输入描述
- 输入两行, 第一行为n, 第二行为k
- 给定n的范围是 [1,9], 给定k的范围是 [1,n!]
输出描述
输出排在第k位置的数字.
示例1
输入:
3
3
输出:
213
示例2
输入:
2
2
输出:
21
题解
Python
import itertools
def main():
def power(n: int) -> int:
assert n > 0
p = 1
for i in range(1, n + 1):
p *= i
return p
# 读取输入
# 生成所有的排列
# 找到第k个排列
n = int(input())
assert 1 <= n <= 9
k = int(input())
power_n = power(n)
assert 1 <= k <= power_n
# 生成所有的数字
nums = tuple(i for i in range(1, n + 1))
# 生成排列的迭代器
it = itertools.permutations(nums)
# 注意, k是从1开始计数的
for i in range(k):
ans = next(it)
# 打印结果
s = "".join(map(str, ans))
print(s)
if __name__ == "__main__":
main()
C++
#include <cassert>
#include <algorithm>
#include <iostream>
#include <vector>
void solution() {
int n = 0;
std::cin >> n;
assert(n > 0);
int k = 0;
std::cin >> k;
assert(k > 0);
std::string line;
for (int i = 1; i <= n; ++i) {
line += i + '0';
}
int count = 1;
while (count < k && std::next_permutation(line.begin(), line.end())) {
count += 1;
}
std::cout << line << std::endl;
}
int main() {
solution();
return 0;
}