【找规律】求123456789的第几个全排列

博客围绕求1~n(最多n=9)的第K个全排列展开。通过n = 4、k = 17的例子找规律,指出第n位连续出现次数为后面n - 1个数的排列方案总数(n - 1)!个,可通过k/(n - 1)!和k%(n - 1)!计算,还提及string的push_back和erase用法,并给出AC代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1~n(最多n=9即123456789),让你来求第K个全排列。(题中告诉你规律:1234...n的全排列一共有n!个)

大致思路:

举例子找规律的题,见下面这个例子:

以n = 4, k = 17的情况来分析,所有排列组合情况如下:

1234
1243
1324
1342
1423
1432
2134
2143
2314 
2341
2413
2431
3124
3142
3214
3241
3412 <--- k = 17
3421
4123
4132
4213
4231
4312
4321

可以发现,对于第n位,它连续出现的次数就是它后面n-1个数的排列方案总数即(n-1)!个

于是,通过k/(n-1)!和k%(n-1)!就能来做了。阶乘开一个数组来存吧。然后要注意k是从1开始的,而从字符串中取某一位是从0开始的,所以要首先k-=1。(这个举n=1,k=1的例子可知)

这里我觉得很subtle的就是string的push_back用法和erase用法,我还以为只有vector有嘞,string真厉害:

  • string.push_back(str) 直接在本身新增字符串
  • string.erase(i,n) 删除string[i]开始的n个字符

AC代码:

class Solution {
public:
    string getPermutation(int n, int k) {
        int f[1000]; //f[i]=i!
        string res;
        string nn = "123456789";
        f[0]=1;
        for(int i=1;i<=1000;i++)
            f[i] = f[i-1] * i; //求阶乘
        k--;
        for(int i=1;i<=n;i++) //n位数
        {
            int a = k/f[n-i];
            k = k%f[n-i];
            res.push_back(nn[a]);
            nn.erase(a,1);
        }
        return res;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值