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

news/2024/7/20 19:54:55 标签: 华为od, 算法, Java, Javascript, 数据结构

题目部分

题目华为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.niftyadmin.cn/n/5028960.html

相关文章

【LeetCode-中等题】 151. 反转字符串中的单词

文章目录 题目方法一&#xff1a;双指针去除空格 题目 方法一&#xff1a;双指针去除空格 核心代码去除首尾以及中间多余空格(在原串上修改) //去除首尾以及中间多余空格(在原串上修改)public StringBuilder trimSpaces(String s) { int len s.length();StringBuilder str …

云桌面打开部署在linux的服务特别卡 怎么解决

云桌面打开部署在 Linux 服务器上的服务卡顿可能是由多种因素引起的&#xff0c;包括服务器性能、网络连接、应用程序配置等。以下是一些可能的解决方法&#xff0c;可以帮助您缓解云桌面访问部署在 Linux 服务器上的服务时的卡顿问题&#xff1a; 优化服务器性能&#xff1a; …

go net/http 源码解读

回顾 1. HTTP Server 在 go 中启动一个 http server 只需短短几行代码 func PingHandler(w http.ResponseWriter, r *http.Request) {io.WriteString(w, "pong!") }func main() {http.HandleFunc("/ping", PingHandler)log.Fatal(http.ListenAndServe(&…

C++ 霍夫变换圆形检测

霍夫变换圆形检测 一、检测原理二、实现步骤三、算法实现一、检测原理 HoughCircles 参数说明: HoughCircles(   InputArray image,  // 输入图像 ,必须是 8 位的单通道灰度图像   OutputArray circles,  // 输出结果,发现的圆信息   Int method,  // 方法 - HOUGH…

【电子元件】常用电子元器件的识别之霍尔元件

目录 1. 霍尔元件的结构与特点1.1 霍尔元件的组成结构1.2 霍尔元件的霍尔效应 2. 霍尔元件的图形符号与型号2.1 1.图形符号2.2 2.型号说明 3. 半导体霍尔效应的原理3.1 半导体中的左手定则3.2 P型半导体霍尔效应的原理3.3 N型半导体霍尔效应的原理 4. 霍尔元件的电势计算与工作…

【RTOS学习】单片机中的C语言

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 本喵默认各位小伙伴都会C语言&#xff0c;我们平时学习C语言都是在Windows环境下学习的&#xff0…

Powdersigner + PostgreSql 同步表结构到pg数据库

要用Powdersigner同步表结构到PostgreSql数据库&#xff0c; Powdersigner 版本是 16.5&#xff0c;当前模型是mysql的 1&#xff0c;修改当前模型内容为postgresql的 Database --> Change Current DBMS 选择PostgreSQL 最大版本的&#xff08;因为Powdersigner内置版本一…

Java导出Excel模板实现级联下拉框

Java导出Excel模板实现级联下拉 1、依赖导入2、代码实现3、级联参数说明4、效果显示 1、依赖导入 项目使用jdk8版本&#xff0c;apache的导入导出工具类。 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId>&…