目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
告警抑制,是指高优先级告警抑制低优先级告警的规则。
高优先级告警产生后,低优先级告警不再产生。
请根据原始告警列表和告警抑制关系,给出实际产生的告警列表。
不会出现循环抑制的情况。
告警不会传递,比如A -> B -> C,这种情况下A不会直接抑制C。
但被抑制的告警仍然可以抑制其它低优先级告警。
二、输入描述
第一行为数字N,表示告警抑制关系个数,0 <= N <= 120
接下来的N行,每行是由空格分割的两个告警ID,例如:id1 id2,表示id1抑制id2,
告警ID的格式为:
大写字母+0个或者1个数字
最后一行为告警产生列表,列表长度1~100。
三、输出描述
真实产生的告警列表。
四、解题思路
- 输入告警抑制关系个数N;
- 接下来的N行,每行是由空格分割的两个告警ID;
- 接下来的N行,每行是由空格分割的两个告警ID,加入告警之间的关系Map;
- key:被抑制的报警;
- value:可以抑制key的报警集合;
- 最后一行为告警产生列表;
- 遍历告警列表,如果没被抑制,则加入到告警列表;
- 输出真实产生的告警列表;
五、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 告警抑制关系个数
int N = Integer.parseInt(sc.nextLine());
/**
* 告警之间的关系
* key:被抑制的报警
* value:可以抑制key的报警集合
*/
Map<String, HashSet<String>> map = new HashMap<>();
// 接下来的N行,每行是由空格分割的两个告警ID
for (int i = 0; i < N; i++) {
String[] arr = sc.nextLine().split(" ");
map.putIfAbsent(arr[1], new HashSet<>());
HashSet<String> set = map.get(arr[1]);
set.add(arr[0]);
}
// 最后一行为告警产生列表
String[] warnArr = sc.nextLine().split(" ");
HashSet<String> set = new HashSet<>(Arrays.asList(warnArr));
// 告警列表
StringBuilder builder = new StringBuilder();
for (String warn : warnArr) {
// 如果没被抑制,则加入到告警列表
if (!map.containsKey(warn) || Collections.disjoint(map.get(warn), set)) {
builder.append(warn).append(" ");
}
}
String result = builder.toString();
System.out.println(result.substring(0, result.length()-1));
}
六、效果展示
1、输入
3
A C
B D
A B
A B C D E
2、输出
A E
3、说明
A抑制了C;
B抑制了D;
A抑制了B;
最终的实际报警为A E。
🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。