通过率 44% · 提交 511 · 通过 224
小慕正在处理一个告警管理系统,系统中存在规则:高优先级告警会抑制低优先级告警。当高优先级告警产生时,被抑制的低优先级告警将不会实际产生。现在,小慕需要根据给定的原始告警列表和告警抑制关系,计算出实际产生的告警列表。。告警抑制不会传递,例如A抑制B、B抑制C,这种情况下A不会直接抑制C。但被抑制的告警仍然可以抑制其他更低优先级的告警。
这类题属于华为 OD 机考真题方向中「100分 / 2024E」方向的高频题型,通常考察对「100分 / 2024E」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行为数字N,表示告警抑制关系个数,0 <= N <= 120
接下来N行,每行是由空格分隔的两个告警ID,例如: id1 id2,表示id1抑制id2。
最后一行为告警产生列表,列表长度[1, 100]
真实产生的告警列表
示例 1
输入示例
2 A B B C A B C D E
输出示例
A D E
A抑制B,故当A出现之后,B由于被抑制不再产生。由于被抑制的告警仍然可以抑制其他低优先级告警,故B虽然被抑制,但仍然可以抑制C,故C不再产生。
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
抑制和被抑制的关系,可以看作是一种依赖关系或配对关系。这种关系很自然会想到使用哈希表来构建。
由于同一个高级告警可能会抑制若干个低级告警,因此我们可以以高级告警作为 key,被抑制的低级告警所组成的列表作为 value,来构建哈希表。
在后续遍历整个告警列表的时候,我们要做两件事:
1. 判断当前遇到的这个告警是否已经被前面的其他更高优先级的告警抑制了 2. 这个告警如果能够抑制其他低优先级告警,那么这些低优先级告警即使在后面出现了也不应该输出
因此我们可以构建一个哈希集合,用来储存所有被抑制的不能输出的告警所构成的集合:
在遍历过程中,如果当前告警并没有位于 under_control_set 中,则它没有被抑制,可以输出:
同时,当前告警如果抑制了其他若干低等级告警,这些低等级告警都应该加入 under_control_set 中:
代码到这里基本已经完成了。但注意到还有一个可以优化的地方:同一个高级告警可能多次反复出现,但这个告警在第一次出现的时候就已经抑制了若干低级告警了,如果多次执行 for under_control in hash_table[string] 的循环,加入到 under_control_set 中的低级告警都是重复的无用功,会造成开销的浪费。
因此我们可以再构建一个 appear_set 哈希集合,用来储存出现过的告警所构成的集合。在执行 for under_control in hash_table[string] 的循环之前,多加一个判断:
复杂度分析
设抑制关系共 n 条,告警序列的长度为 m。
这也从复杂度角度解释了正文里 appear_set 这个优化的价值:如果没有它,同一个高频出现的告警每出现一次就要重扫一遍自己的抑制列表,最坏会退化到 O(n * m);加上它之后,每条抑制关系只被处理一次。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有