个人博客首页: KJ.JK
系列专栏:华为OD机试真题(C++)
专栏介绍: 华为OD机试真题汇总,使用C++来进行解析解答实现,帮助大家更好的AC题目,分享各种解题思路,让大家更好通过机试,持续更新中,欢迎大家订阅
给定参数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位置的数字。
输入
3
3
输出
213
说明:
3的排列有123,132,213…,那么第三位置就是213
输入
2
2
输出
21
说明:
2的排列有12,21,那么第二位置的为21。
#include
using namespace std;
string GetPermutation(int n, int k)
{
vector<int> factorial(n);
factorial[0] = 1;
for (int i = 1; i < n; ++i) {
factorial[i] = factorial[i - 1] * i;
}
--k;
string output;
vector<int> valid(n + 1, 1);
for (int i = 1; i <= n; ++i) {
int order = k / factorial[n - i] + 1;
for (int j = 1; j <= n; ++j) {
order -= valid[j];
if (!order) {
output += (j + '0');
valid[j] = 0;
break;
}
}
k %= factorial[n - i];
}
return output;
}
int main(int argc, char **argv)
{
int k, n;
while (cin >> k >> n) {
cout << GetPermutation(k, n) << endl;
}
return 0;
}
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习