这一套是每日一练的困难部分,我的境界不够,但是还是想了解一下。我对本题并没有思路。
4条回答 默认 最新
- 技术专家团-小桥流水 2023-11-06 14:46关注
n个数的排列组合问题递归思路如下:
定义一个静态数组a,a中元素从1到n排列。每一轮递归都会用到这个数组。
先计算s =(n-1)!,然后计算 k / s,得到的这个数,就是本轮递归result[0]的第一个数,然后把这个数移动到数组的最后,后续的序列就不能再使用这个数字。
然后判断 k%s是否为0,如果为0,说明本次最后的一个序列就是要求的,并且这个需求是剩余数中的最大数,逆序从数组a中组合就可以了。
如果不为0,就递归 n-1 时的情况,这时,需要减去已经跳过的序列个数。
特别的,当k=1的时候,直接用数组a的前n个数拼起来就是要求的。运行结果:
代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> char* getPermutation(int n, int k) { int s1 = 1, i, j, t; char* result = (char*)malloc(n + 1); static int a[9] = { 1,2,3,4,5,6,7,8,9 }; char* tmp = 0; int bs; result[n] = '\0'; if (k == 1) { for (i = 0; i < n; i++) result[i] = a[i] + '0'; return result; } //计算n-1的阶乘 for (i = 1; i <= n - 1; i++) s1 *= i; if (k == n * s1) //k就是n的阶乘 { for (i = 0; i < n; i++) { result[i] = a[n - 1 - i]+'0'; } return result; } bs = k / s1; result[0] = a[bs] + '0'; //第一个数字 if (k % s1 == 0) { for (i = 1; i < n; i++) result[i] = a[n - i] + '0'; return result; } else { //将a[bs]从数组中移除 for (i = 0; i < 9; i++) { if (a[i] == a[bs]) { t = a[bs]; for (j = i; j < 8; j++) a[j] = a[j + 1]; a[8] = t; } } tmp = getPermutation(n - 1, k % s1); strcpy(result + 1, tmp); free(tmp); return result; } } int main() { int n, k; char* p = 0; scanf("%d %d", &n, &k); p = getPermutation(n, k); if (p) { printf("%s", p); free(p); } return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥30 电脑误删了手机的照片怎么恢复?
- ¥15 (标签-python|关键词-char)
- ¥15 python+selenium,在新增时弹出了一个输入框
- ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
- ¥20 学生成绩管理系统设计
- ¥15 来一个cc穿盾脚本开发者
- ¥15 CST2023安装报错
- ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办
- ¥15 有人懂怎么做大模型的客服系统吗?卡住了卡住了
- ¥20 firefly-rk3399上启动卡住了