【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 告警抑制

news/2024/7/20 18:23:19 标签: 华为od, java, 算法, javascript, python

2023大厂笔试模拟练习网站(含题解)
www.codefun2000.com
最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200+道互联网大厂模拟练习题,还在极速更新中。欢迎关注公众号“塔子哥学算法”获取最新消息。

提交链接:

 首页 - CodeFun2000

为了更好的阅读体检,可以查看OJ上的题解。进入提交链接,点击右边菜单栏的"查看塔子哥的题解"

题目内容

告警抑制,是指高优先级告警抑制低优先级告警的规则。高优先级告警产生后,低优先级告警不再产生。请根据原始告警列表和告警抑制关系,给出实际产生的告警列表。

  • 不会出现循环抑制的情况

  • 告警不会传递,比如A->B,B->C,这种情况下A不会直接抑制C。但被抑制的告警仍然可以抑制其他低优先级告警。

输入描述

第一行为数字N,表示告警抑制关系个数,0 \leq N \leq120

接下来N行,每行是由空格分隔的两个告警ID,例如: id1 id2,表示id1抑制id2,告警ID的格式为:

大写字母+0个或者1个数字

最后一行为告警产生列表,列表长度[1,100]

输出描述

真实产生的告警列表

备注

告警ID之间以单个空格分隔

样例

输入

2
A B
B C
A B C D E

输出

A D E

说明

A抑制了B,B抑制了C,最后实际的告警为A D E

输入

4
F G
C B
A G
A0 A
A B C D E

输出

A C D E

说明

Java算法代码

import java.util.*;
 
public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
 
    int n = Integer.parseInt(sc.nextLine());
 
    HashMap<String, HashSet<String>> fa = new HashMap<>();
    for (int i = 0; i < n; i++) {
      String[] tmp = sc.nextLine().split(" ");
      // id1抑制id2
      String id1 = tmp[0], id2 = tmp[1];
      fa.putIfAbsent(id2, new HashSet<>());
      // fa用于记录抑制id2的所有id1的集合
      fa.get(id2).add(id1);
    }
 
    String[] alertList = sc.nextLine().split(" ");
 
    System.out.println(getResult(fa, alertList));
  }
 
  public static String getResult(HashMap<String, HashSet<String>> fa, String[] alertList) {
    HashSet<String> alertSet = new HashSet<>(Arrays.asList(alertList));
 
    StringJoiner sj = new StringJoiner(" ");
 
    for (String id2 : alertList) {
      // 如果没有抑制id2的更高级的告警,或者有抑制id2的更高级的告警,但是此高级告警没有出现在alertList列表中
      if (!fa.containsKey(id2) || Collections.disjoint(fa.get(id2), alertSet)) {
        // 此时id2就可以正常告警
        sj.add(id2);
      }
    }
 
    return sj.toString();
  }
}

JS算法代码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
 
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
 
const lines = [];
let n;
rl.on("line", (line) => {
  lines.push(line);
 
  if (lines.length == 1) {
    n = lines[0] - 0;
  }
 
  if (n !== undefined && lines.length == n + 2) {
    lines.shift();
    const alertList = lines.pop().split(" ");
    const relations = lines.map((str) => str.split(" "));
    console.log(getResult(relations, alertList));
    lines.length = 0;
  }
});
 
function getResult(relations, alertList) {
  const fa = {};
 
  for (let [id1, id2] of relations) {
    // id1抑制id2
    if (!fa[id2]) fa[id2] = new Set();
    // fa用于记录抑制id2的所有id1的集合
    fa[id2].add(id1);
  }
 
  const alertSet = new Set(alertList);
 
  const ans = [];
  for (let id2 of alertList) {
    // 如果没有抑制id2的更高级的告警,或者有抑制id2的更高级的告警,但是此高级告警没有出现在alertList列表中
    if (disjoint(alertSet, fa[id2])) {
      // 此时id2就可以正常告警
      ans.push(id2);
    }
  }
 
  return ans.join(" ");
}
 
// 判断两个集合是否不相交,不相交返回true,相交返回false
function disjoint(set1, set2) {
  if (!set1 || !set2) return true;
 
  for (let id1 of set1) {
    if (set2.has(id1)) return false;
  }
  return true;
}

Python算法代码

# 输入获取
n = int(input())
relations = [input().split() for _ in range(n)]
alertList = input().split()
 
 
# 算法入口
def getResult():
    fa = {}
 
    # id1抑制id2
    for id1, id2 in relations:
        if fa.get(id2) is None:
            fa[id2] = set()
        # fa用于记录抑制id2的所有id1的集合
        fa[id2].add(id1)
 
    alertSet = set(alertList)
 
    ans = []
 
    for id2 in alertList:
        # 如果没有抑制id2的更高级的告警,或者有抑制id2的更高级的告警,但是此高级告警没有出现在alertList列表中
        if fa.get(id2) is None or alertSet.isdisjoint(fa[id2]):
            # 此时id2就可以正常告警
            ans.append(id2)
 
    return " ".join(ans)
 
 
# 算法调用
print(getResult())

http://www.niftyadmin.cn/n/440239.html

相关文章

JavaScript之ES6高级语法(四)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 ES6高级语法(四&#xff09; 前言一、深浅拷贝1.1、浅拷贝1.2、深拷贝1.2.1、递归实现深拷贝1.2.2、js库lodash里面cloneDee…

机器视觉初步4:Opencv简介与学习角度

了解一个新应用的最好方式就是先去官网转转。 本章目录 1.简介2.C或Python3安装配置3.Opencv基本函数4.从项目入手了解5.从视觉原理的划分入手 1.简介 Opencv官网 OpenCV(开源的计算机视觉库)是基于BSD协议,因此它可免费用于学术和商业用途。其提供C,C,Python和Java接口,支持…

英语学习:S开头

sacred 神圣的 sacrifice 牺牲 sad 使人悲伤的 sadness 悲哀 safe 安全的 safety 安全 sail 航行 sailing 航海 sailor 水手 salad 色拉 salary 薪资 sale 卖 salesman 男售货员 salt 盐 salty 盐的 salute 敬礼 same 同样的事 sand 沙子 sandwich 三明治 sa…

SQL详细处理流程.md

连接器&#xff1a;管理连接&#xff0c;权限验证解析器&#xff1a;词法以及语法分析优化器&#xff1a;生成执行计划&#xff0c;选择合适索引执行器&#xff1a;操作引擎获取结果存储引擎&#xff1a;存储数据&#xff0c;提供读写接口

【c语言初阶】操作符全面知识总结

操作符详解 操作符种类算术操作符移位操作符位操作符编程题&#xff1a;两数交换多种解法编程题&#xff1a;求一个数在内存中二进制数1的个数赋值操作符单目操作符关系操作符编程题&#xff1a;谁是凶手逻辑操作符一道笔试题条件操作符逗号表达式下标引用、函数调用和结构体成…

如何「假装」自己做过性能测试?

简历&#xff1a; 熟练掌握后端性能、压力测试 面试官&#xff1a; 你们是怎么做性能测试的&#xff1f; 我&#xff1a; 主要是对后端服务模块进行性能测试&#xff0c;我们上一个项目是是一个群聊项目&#xff0c;类似于QQ群&#xff0c;大家可以在一个群里聊天&#xf…

记录一下RocketMQ中遇见的 连环大坑!!!差点没把我摔死

目录 环境&#xff1a;Win10 &#xff0c; 不是 linux 首先我遇见的第一个问题是&#xff1a; No route info of this topic 问题原因&#xff1a; PS&#xff1a; 64位系统环境下&#xff0c;如果软件在安装时安装路径默认c:\progarmfiles即为64位&#xff0c;默认c:\pr…

Burpsuit使用03:拦截请求并修改响应

burpsuite是渗透的必备工具&#xff0c;使用它可以进行一些截包分析&#xff0c;修改包数据、暴力破解、扫描等功能&#xff0c;使用最多的场景应该是设置代理拦截数据包分析数据和爆破。 文章目录 拦截请求并修改响应Intercept is offForwardDropAction 拦截请求并修改响应 拦…