通过率 72% · 提交 688 · 通过 496
小慕当前负责的项目迭代周期内有 N 个功能点(F1, F2, ..., FN)需要进行覆盖测试,每个功能点都被分配了对应的,功能点使用其 ID 作为下标进行标识。 小慕设计了 M 个(T1, T2, ..., TM),每个用例对应了一个覆盖功能点的集合,测试用例使用其 ID 作为下标进行标识,测试用例的优先级定义为其覆盖的功能点的优先级之和。 在开始测试之前,小慕需要确定测试用例的执行顺序,规则为:优先级高的用例先执行,如果存在优先级相同的用例,用例 ID 小的先执行。
这类题属于华为 OD 机考真题方向中「100分 / 排序」方向的高频题型,通常考察对「100分 / 排序」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行输入为 N 和 M ,N 表示特性的数量,M 表示测试用例的数量,0<N<=100 ,0<M<=100
之后 N 行表示特性 ID=1 到特性 ID=N 的优先级。
再接下来 M 行表示测试用例 ID=1 到测试用例 ID=M 关联的特性的 ID 的列表。
按照执行顺序(优先级从大到小)输出测试用例的 ID,每行一个 ID。
测试用例覆盖的 ID 不重复。
示例 1
输入示例
5 4 1 1 2 3 5 1 2 3 1 4 3 4 5 2 3 4
输出示例
3 4 1 2
测试用例的优先级计算如下: T1=Pf1+Pf2+Pf3=1+1+2=4 T2=Pf1+Pf4=1+3=4 T3=Pf3+Pf4+Pf5=2+3+5=10 T4=Pf2+Pf3+Pf4=1+2+3=6 按照优先级从大到小,以及相同优先级,ID 小的先执行的规则,执行顺序为 T3,T4,T1,T2
示例 2
输入示例
3 3 3 1 5 1 2 3 1 2 3 1 2 3
输出示例
1 2 3
测试用例的优先级计算如下: T1=Pf1+Pf2+Pf3=3+1+5=9 T2=Pf1+Pf2+Pf3=3+1+5=9 T3=Pf1+Pf2+Pf3=3+1+5=9 每个优先级一样,按照 ID 从小到大执行,执行顺序为 T1,T2,T3
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
又是一道典型的直接看用例比看题意更容易理解的题目。
对于每一个测试用例,ID 都对应一个优先级,而这个优先级的计算是若干特性的优先级的叠加。
假设所有特性对应的优先级已经储存在哈希表 dic 中,dic[num] 表示特性 num 的优先级。
对于特定的测试用例,包含了若干特性的测试 num1, num2, ...,这个测试用例的总优先级为:
最终再进行排序和逐行输出即可。
思路展开 代码分两轮读入、一轮排序输出。第一轮先读入 N 和 M,再用哈希表 dic 逐行记录每个功能点的优先级,dic[i] 表示功能点 i 的优先级,功能点编号从 1 到 N。第二轮读入 M 行测试用例,每行是该用例覆盖的功能点编号列表,用生成器表达式 sum(dic[num] for num in nums) 把这些功能点的优先级累加,作为用例 i 的优先级存入 ans_dic。最后把所有用例 ID 取出,用 lambda 按 (-ans_dic[x], x) 排序:第一关键字取负号实现优先级从高到低,第二关键字是用例 ID 本身,实现优先级相同时 ID 小的先执行。排序后的列表就是执行顺序,逐行输出即可。
复杂度分析 设 N 为功能点个数,M 为测试用例个数,K 为所有测试用例覆盖的功能点编号总数(即 M 行输入里数字的总量)。构建优先级哈希表需要 O(N);计算所有用例的优先级要把每个覆盖编号各访问一次,共 O(K);对 M 个用例 ID 排序是 O(M log M),这也是用例很多时的主要瓶颈。总时间复杂度 O(N + K + M log M),空间上两个哈希表分别占 O(N) 和 O(M)。
边界与注意事项
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有