华为OD机考算法题:告警抑制

题目部分

题目华为OD机考算法题:告警抑制
难度
题目说明告警抑制,是指高优先级告警抑制低优先级告警的规则。高优先级告警产生后,低优先级告警不再产生。请根据原始告警列表和告警抑制关系,给出实际产生的告警列表。
注:不会出现循环抑制的情况。
告警不会传递,比如A->B,B->C,这种情况下A不会直接抑制C,但被抑制的告警仍然可以抑制其他低优先级告警。
如果两个告警存在抑制关系,被抑制的低优先级告警无论是在高优先级告警的前面还是后面,都会被抑制。(笔者注)
输入描述第一行为数字N,表示告警抑制关系个数,0<=N <=120。
接下来 N 行,每行是由空格分隔的两个告警ID,例如: id1 id2,表示id1抑制id2。告警ID的格式为:大写字母 + 0个或者1个数字。
最后一行为告警产生列表,列表长度[1,100]。
输出描述真实产生的告警列表。
补充说明告警 ID 之间以单个空格分隔。
------------------------------------------------------
示例
示例1
输入2
A B
B C
A B C D E
输出A D E
说明A抑制了B,B抑制了C,最后实际的告警为A D E。
示例2
输入4
F G
C B
A G
A0 A
A B C D E
输出A C D E
说明


解读与分析

题目解读:

此题要求从一个字符串中,删除被抑制的告警,只输出未被抑制的告警。输出后的告警顺序与源字符串保持一致。
注:在题目的告警列表中,如果两个告警存在抑制关系,无论被抑制的低优先级告警是在高优先级告警的前面还是后面,都会被抑制。题目中并未明说,但在示例 2 中是按照这个规则处理的。

此题在说明中存在歧义,需要通过示例 2 来澄清。个人认为,应该在题干中阐述清楚,而不是通过示例说明。

分析与思路:

先申明2个变量:
1. sourceAlarms,数组,输入的原始告警列表。
2. cutOffArray,二维数组,用以存放告警的抑制关系。数组的每个元素(设为 cutOffEle)是一个包含2个元素的抑制关系,cutOffEle[0] 是高优先级的告警,cutOffEle[1] 是被抑制的低优先级告警。
3. rmAlarmSet,集合,用以存储初始告警列表中需要删除的告警。

实现步骤如下:
1. 构建cutOffArray。逐行读取抑制关系,每行数据对应一个新的 cutOffEle。把每行数据拆分成两个告警ID,其中第一个告警 ID 放到 cutOffEle[0] 中,第二个告警 ID 放到 cutOffEle[1] 中,然后把 cutOffEle 作为元素放到数组 cutOffArray 中。
2. 构建 rmAlarmSet。遍历 cutOffArray,对于每个元素 cutOffEle,如果 cutOffEle[0] 在 sourceAlarms 中存在,则把 cutOffEle[1] 添加到 rmAlarmSet 中。
3. 遍历 sourceAlarms,如果告警 ID 不在 rmAlarmSet 中,则输出它;在 rmAlarmSet 中,则跳过。

说明:在第 2 步中,判断 cutOffEle[0] 在 sourceAlarms 中时,因为 sourceAlarms 是个数组,会让时间复杂度变大,可以先把 sourceAlarms 中所有的告警信息放到一个集合,如 sourceAlarmSet 中。

此算法的时间复杂度为 O(n),空间复杂度为 O(n)。


代码实现

Java代码

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;/*** 告警抑制* @since 2023.09.13* @version 0.1* @author Frank**/
public class CutOffAlarms {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String input = sc.nextLine();int count = Integer.parseInt( input );String[][] cutOffArray = new String[count][2];for( int i = 0; i < count; i ++ ){input = sc.nextLine();String[] curCutOff = input.split( " " );cutOffArray[i] = curCutOff;}input = sc.nextLine();String[] sourceAlarms = input.split( " " );processCutOffAlarms( cutOffArray, sourceAlarms );}}private static void processCutOffAlarms( String[][] cutOffArray, String sourceAlarms[] ){Set<String> sourceAlarmSet = new HashSet<String>();for( int i = 0; i < sourceAlarms.length; i ++ ){sourceAlarmSet.add( sourceAlarms[i] );}Set<String> rmAlarmSet = new HashSet<String>();for( int i = 0; i < cutOffArray.length; i ++ ){String[] curAlarmEle = cutOffArray[i];if( sourceAlarmSet.contains( curAlarmEle[0] ) ) {rmAlarmSet.add( curAlarmEle[1] );}}StringBuffer sb = new StringBuffer();for( int i = 0; i < sourceAlarms.length; i ++ ){String eachAlarm = sourceAlarms[i];if( rmAlarmSet.contains( eachAlarm )){continue;}sb.append( eachAlarm );if( i != sourceAlarms.length - 1 ){sb.append( " " );}}System.out.println( sb.toString() );}
}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {while (line = await readline()) {var count = parseInt(line);var cutOffArray = new Array();for (var i = 0; i < count; i++) {line = await readline();var curCutOff = line.split(" ");cutOffArray[i] = curCutOff;}line = await readline();var sourceAlarms = line.split(" ");processUnhappyKids(cutOffArray, sourceAlarms);}
}();function processUnhappyKids(cutOffArray, sourceAlarms) {var sourceAlarmSet = new Set();for (var i = 0; i < sourceAlarms.length; i++) {sourceAlarmSet.add(sourceAlarms[i]);}var rmAlarmSet = new Set();for (var i = 0; i < cutOffArray.length; i++) {var curAlarmEle = cutOffArray[i];if (sourceAlarmSet.has(curAlarmEle[0])) {rmAlarmSet.add(curAlarmEle[1]);}}var ret = "";for (var i = 0; i < sourceAlarms.length; i++) {var eachAlarm = sourceAlarms[i];if (rmAlarmSet.has(eachAlarm)) {continue;}ret += eachAlarm;if (i != sourceAlarms.length - 1) {ret += " ";}}console.log(ret);
}

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/80037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity SteamVR 开发教程:用摇杆/触摸板控制人物持续移动(2.x 以上版本)

文章目录 &#x1f4d5;教程说明&#x1f4d5;场景搭建&#x1f4d5;创建移动的动作&#x1f4d5;移动脚本⭐移动⭐实时调整 CharacterController 的高度 &#x1f4d5;取消手部和 CharacterController 的碰撞 持续移动是 VR 开发中的一个常用功能。一般是用户推动手柄摇杆&…

WSL2 内存只有 Windows 的一半?可以设置 .wslconfig 解决

偶然 htop 发现 WSL 里面的内存只有 16GB&#xff0c;而我的 Windows 是 32GB 的&#xff0c;才了解到默认的设置就是 50% 的 RAM 占用&#xff0c;可以通过设置 .wslconfig 解决这个问题。 .wslconfig 的路径 在 C:\Users\YourUsername\.wslconfig&#xff0c;如果发现没有这…

CNN(八):Inception V1算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 1 Inception V1 Inception v1论文 1.1 理论知识 GoogLeNet首次出现在2014年ILSVRC比赛中获得冠军。这次的版本通常称其为Inception V1。…

strncpy

strncpy&#xff1a; 函数介绍&#xff1a; 函数原型&#xff1a; char *strncpy(char *dest, const char *src, int n) 返回值&#xff1a;dest字符串起始地址 说明&#xff1a; 1、当src字符串长度小于n时&#xff0c;则拷贝完字符串后&#xff0c;剩余部分将用空字节填…

建站系列(八)--- 本地开发环境搭建(WNMP)

目录 相关系列文章前言一、准备工作二、Nginx安装三、MySQL安装四、PHP安装及Nginx配置五、总结 相关系列文章 建站系列&#xff08;一&#xff09;— 网站基本常识 建站系列&#xff08;二&#xff09;— 域名、IP地址、URL、端口详解 建站系列&#xff08;三&#xff09;— …

Linux防火的常用命令

文章目录 防火墙查看状态防火墙启动关闭命令防火墙配置添加规则移除规则 防火墙查看状态 防火墙重新载入(必须重新载入后才能生效) firewall-cmd --reload防火墙查看基础状态 systemctl status firewalld #查看状态查看 防火墙所有规则 firewall-cmd --list-all查看rich-ru…

【设计模式】二、UML 类图概述

文章目录 常见含义含义依赖关系&#xff08;Dependence&#xff09;泛化关系&#xff08;Generalization&#xff09;实现关系&#xff08;Implementation&#xff09;关联关系&#xff08;Association&#xff09;聚合关系&#xff08;Aggregation&#xff09;组合关系&#x…

【JavaScript保姆级教程】输出函数和初识变量

文章目录 前言一、输出内容1.1 document.write()函数1.2 console.log()函数查看终端输出信息 1.3 alert()函数 二、变量的使用1.1 变量的声明1.3变量的赋值1.4 变量的声明和赋值 三、输入提示框的使用总结 前言 JavaScript是一种强大的脚本语言&#xff0c;广泛应用于网页开发…

C++DAY10 结构体·定义与使用

结构体的作用&#xff1a; 结构体属于用户自定义的数据类型&#xff0c;允许用户储存不同的数据类型。 #include<iostream> using namespace std;//结构体的语法 //struct 结构体名 { 结构体成员列表 }; struct Student {//成员列表//姓名string name;//年龄int age;/…

git 提交冲突

提示&#xff1a;您有偏离的分支&#xff0c;需要指定如何调和它们。您可以在执行下一次 提示&#xff1a;pull 操作之前执行下面一条命令来抑制本消息&#xff1a; 提示&#xff1a; 提示&#xff1a; git config pull.rebase false # 合并 提示&#xff1a; git config pull.…

文件批量重命名:自定义命名与扩展名更改

你是否曾经需要批量更改文件名称和类型&#xff1f;如果你有大量文件需要重命名和更改类型&#xff0c;那么今天我们将向你介绍一种简单的方法来轻松批量更改文件名称和类型。无论你是需要将一个文件夹中的所有图片改为另一种格式&#xff0c;还是需要将一个文件夹中的所有文档…

【基于多输出方向的同步异步日志系统】

本项目涉及的到所有源码见以下链接&#xff1a; https://gitee.com/ace-zhe/wz_log 一、项目简介 1.日志的概念&#xff08;白话版&#xff09; 日志类似于日记&#xff0c;通常是指对完成某件事情的过程中状态等的记录&#xff0c;而计算机中的日志是指日志数据&#xff0c…

轻松学习 Spring 事务

文章目录 一. Spring事务简介二. Spring事务使用1. 编程式事务2. 声明式事务 三. Transactional的使用1. 参数作用2. 事务失效的场景3. Transactional工作原理 四. Spring 事务的隔离级别五. Spring事务传播机制 一. Spring事务简介 在之前的博客已经介绍了在 Spring 环境中整…

结构体变量的初始化和引用

任务描述 本关任务&#xff1a;从键盘输入两个学生的学号&#xff0c;姓名和成绩&#xff08;整数&#xff09;&#xff0c;分别存入结构体中&#xff0c;输出成绩较高的学生的学号&#xff0c;姓名和成绩。 相关知识 结构体类型用于描述由多个不同数据类型的数据构成的复合…

浅析安防监控系统/AI视频智能分析算法:河道水文水位超标算法应用

传统的水位水尺刻度尺位监测中&#xff0c;所采用的人工读数方式&#xff0c;效率较为低下且 人工成本较高&#xff0c;不利于作业流程的数字化。尽管感应器检测会自动对水位的模拟输入进行筛选&#xff0c;但是由于成本、使用场景要求高、后续日常维护复杂等多种因素&#xff…

Pytorch实现图像语义分割(初体验)

Pytorch实现图像语义分割&#xff08;初体验&#xff09; 这些天在学习图像语义分割相关的知识&#xff0c;并简单写了篇概述。原本想先看几篇经典论文&#xff0c;如全卷积网络FCN&#xff0c;奈何英语水平有限&#xff0c;翻译起来实在费劲。想来不如先直接体验一下语义分割…

vscode c++解决包含头文件红色波浪线问题

安装c/c插件后&#xff0c;按ctrlshiftp&#xff0c; 点击打开了c_cpp_properties.json文件&#xff0c;对其中的IncludePath进行编辑&#xff0c;示例如下&#xff1a; "includePath": ["${workspaceFolder}/**","${workspaceFolder}/include/**&q…

Gin 打包vue或react项目输出文件到程序二进制文件

Gin 打包vue或react项目输出文件到程序二进制文件 背景解决方案1. 示例目录结构2. 有如下问题要解决:3. 方案探索 效果 背景 前后端分离已成为行业主流&#xff0c;vue或react等项目生成的文件独立在一个单独目录&#xff0c;与后端项目无关。 实际部署中&#xff0c;通常前面套…

JDK9特性——模块化REPL工具

文章目录 前言模块化模块化案例 可交互的REPL工具 前言 谈到Java9大家往往第一个想到的就是Jigsaw项目&#xff08;后改名为Modularity&#xff09;。众所周知&#xff0c;Java已经发展超过20年(95年最初发布)&#xff0c;Java和相关生态在不断丰富的同时也越来越暴露出一些问…

嵌入式入门教学——模电基础概念

目录 1、模拟信号和模拟电路 2、研究领域 3、常用术语 3.1、共价键 3.2、电场 3.3、温度的电压当量 3.4、动态信号 3.5、直流电流和交流电流 3.6、内阻 3.7、信号频率 3.8、电容 3.9、电感 3.10、相位 3.11、信号失真 3.12、电导 3.13、跨导 3.14、电位 3.15…