通过率 44% · 提交 440 · 通过 193
小慕设置了一个保密柜,但自己不小心忘记了密码。 他只记得密码全部由数字组成,而且所有数字都不重复。 请你根据他记住的数字范围和密码的最少数字个数,帮他找出所有可能的。 规则如下: 输出的组合必须从可选的数字范围中选取,且数字不能重复; 输出的密码数字要按照从小到大的顺序排列,密码组合需要按照字母顺序,从小到大的顺序排序。 输出的每个组合包含的数字数量要大于等于密码的最少数字个数; 如果可能的组合为空,则返回"None"。
这类题属于华为 OD 机考真题方向中「200分 / DFS」方向的高频题型,通常考察对「200分 / DFS」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入的第一行是可能的密码数字列表,数字间以半角逗号分隔
输入的第二行是密码最小数字数量
可能的密码组合,每种组合显示成一行,每个组合内部的数字以半角逗号分隔,从小到大的顺序排列。 输出的组合间需要按照字典序排序。比如:2,3,4 放到 2,4 的前面
nk","true"],"2":["inlineCode","true"]},"nextNum":3}},"type":"text","referenceRecordMap":{},"extra":{"mention_page_title":{},"external_mention_url":{}},"isKeepQuoteContainer":false,"isFromCode":false,"selection":[{"id":15,"type":"text","selection":{"start":0,"end":81},"recordId":"PpEpdcOFjogqehxFqY7cFBGHnHg"}],"payloadMap":{},"isCut":false}" data-lark-record-format="docx/text" class="lark-record-clipboard">
示例 1
输入示例
2,3,4 2
输出示例
2,3 2,3,4 2,4 3,4
最小密码数量是两个,可能有三种组合:2,3、2,4、3,4;三个密码有一种:2,3,4
示例 2
输入示例
2,0 1
输出示例
0 0,2 2
可能的密码组合,一个的有两种:0、2;两个的有一种:0,2
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
这道题本质上是一道无重复元素子集类型的回溯问题。 无非是在 经典题型、子集 的基础上多加了一个关于最小长度的判断。 套回溯模板即可解决问题。
需要特别注意的是,由于题目要求输出的结果按照字典序从小到大输出,所以可以先对 nums 数组进行排序后再进行回溯。
思路展开 参考代码是子集型回溯的标准写法。先把输入的数字按字符串比较规则(String::compareTo,即字典序)从小到大排序,这一步同时保证了两件事:每个组合内部按字典序排列;组合之间按 DFS 先序生成的顺序天然就是字典序,无需再对结果排序。回溯函数带 startIdx 参数,每层只从 startIdx 往后选数字,选过的位置不会被回头再选,因此不会产生重复组合。与常规「只收叶子节点」的写法不同,这里的收集条件放在函数开头:只要当前 path 的长度已达到最小密码长度 n,就把 path 用逗号拼接后加入答案,也就是说所有长度不小于 n 的组合(而非固定长度)都会被收集。主函数里先做特判:若可选数字总数本身小于 n,任何组合都不可能达标,直接输出 None。
复杂度分析
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有