通过率 78% · 提交 339 · 通过 265
小慕正在处理一个编号系统,给定参数 n,从 1 到 n 会有 n 个整数 1,2,3,...,n。 这 n 个数字共有 种排列,小慕需要情况,并一一标记。 当 n = 3 时,所有排列如下:"123","132","213","231","312","321"。 给定 n 和 k,小慕需要返回。
这类题属于华为 OD 机考真题方向中「100分 / DFS」方向的高频题型,通常考察对「100分 / DFS」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行为 n 第二行为 k
n 的范围是 1 ~ 9
k 的范围是 1 ~ n!
输出排列第 k 位置的数字
示例 1
输入示例
3 3
输出示例
213
示例 2
输入示例
2 2
输出示例
21
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
这道题本质上是一道排列类型的回溯问题。具体过程和 全排列 几乎完全一致。
注意本题可以进行剪枝操作,即无需计算所有排列,只需要计算前 k 个排列即可。
但不做剪枝也可以通过全部用例。
思路展开 代码是一次标准的排列型回溯,只是把「收集所有排列」换成了「数到第 k 个就停」。usedList 记录 1 到 n 中哪些数字已进入当前路径,path 保存当前已选的数字序列。递归中横向遍历时 i 从 1 到 n 递增枚举,每层总是优先尝试更小的数字,因此完整排列被生成的先后顺序恰好就是题目要求的升序(字典序),这是本解法不需要额外排序的关键。每生成一个长度为 n 的完整排列,计数器 cnt 加一;当 cnt 恰好等于 k 时,把 path 拼接成字符串存入 ans。每次回滚之后还有一个剪枝判断:一旦 cnt 已达到 k,后续回溯全部提前返回,不再生成第 k 个之后的排列。
复杂度分析
边界与注意事项
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有