【华为OD机试真题 C++】1011 - 第K个排列 | 机试题+算法思路+考点+代码解析

文章目录

    • 一、题目
      • 题目描述
      • 输入输出
      • 样例1
      • 样例2
    • 二、代码参考
  • 作者:KJ.JK



 
个人博客首页: 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位置的数字。


样例1

输入
3

3


输出
213

说明:
3的排列有123,132,213,那么第三位置就是213

样例2

输入
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;
}

作者:KJ.JK

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习

你可能感兴趣的:(华为OD机试真题(C++),c++,华为,算法,华为od机试真题,第K个排列)