华为OD机试真题——模拟消息队列(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 100分 题型
本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!
2025华为OD真题目录+全流程解析/备考攻略/经验分享
华为OD机试真题《模拟消息队列》:
目录
- 题目名称:模拟消息队列
- 题目描述
- Java
- 问题分析
- 解决思路
- Java 代码实现
- 代码解析
- 示例测试
- 示例1:
- 示例2:
- 综合分析
- python
- 问题分析
- 解决思路
- Python 代码实现
- 代码解析
- 示例测试
- 示例1:
- 示例2:
- 综合分析
- JavaScript
- 问题分析
- 解决思路
- JavaScript 代码实现
- 代码解析
- 1. 输入解析
- 2. 事件排序
- 3. 消费者管理
- 4. 消息分发
- 测试用例
- 用例1:
- 用例2:
- 综合分析
- C++
- 问题分析
- 解决思路
- C++ 代码实现
- 代码解析
- 示例测试
- 示例1:
- 示例2:
- 综合分析
- C语言
- 问题分析
- 解决思路
- 完整代码实现
- 代码解析
- 测试用例
- 输入样例1:
- 输出结果:
- 输入样例2:
- 输出结果:
- 综合分析
- GO
- 问题分析
- 解决思路
- 完整代码实现
- 代码解析
- 测试用例
- 输入1
- 输出1
- 输入2
- 输出2
- 综合分析
题目名称:模拟消息队列
属性 | 内容 |
---|---|
知识点 | 事件排序、优先级处理、逻辑处理 |
时间限制 | 1秒 |
空间限制 | 256MB |
限定语言 | 不限 |
题目描述
模拟一个消息队列的运作,包含一个发布者和若干消费者。发布者在特定时刻发送消息,若此时有消费者订阅,消息将发送给优先级最高的消费者(消费者按输入顺序升序排列,升序即优先级递增)。若没有订阅者,消息被丢弃。消费者在特定时刻订阅或取消订阅,同一时刻的事件处理顺序如下:
- 订阅操作优先于消息发送
- 取消订阅优先于消息发送
输入描述
输入为两行:
- 第一行:2N个正整数,表示N条消息的发送时刻和内容(时刻不重复,但未按时间排序)。例如:
2 22 1 11 4 44
代表3条消息,时刻分别为2(内容22)、1(内容11)、4(内容44)。 - 第二行:2M个正整数,表示M个消费者的订阅和取消订阅时刻。例如:
1 7 2 3
代表两个消费者,第一个订阅时刻1、取消时刻7;第二个订阅时刻2、取消时刻3。
输出描述
输出M行,每行为对应消费者收到的消息内容(按接收顺序排列),若未收到消息则输出-1
。
测试用例
-
输入
2 22 1 11 4 44 5 55 3 33 1 7 2 3
输出
11 33 44 55 22
说明:消息在时刻1、2、3、4、5依次处理,优先级高的消费者(后订阅的)优先接收消息。
-
输入
5 64 11 64 9 97 9 11 4 9
输出
97 64
Java
问题分析
我们需要模拟消息队列的工作流程,其中发布者在特定时刻发送消息,消费者在特定时刻订阅或取消订阅。消息发送时,优先发送给当前活跃且优先级最高的消费者。优先级由消费者的输入顺序决定,后订阅的消费者优先级更高。
解决思路
- 事件收集与排序:将所有订阅、取消订阅、消息发送事件按时间排序,同一时刻的事件按订阅 → 取消 → 消息的顺序处理。
- 维护活跃消费者:使用
TreeSet
维护当前活跃的消费者,按优先级(输入顺序的逆序)排序。 - 消息分发:处理消息事件时,将消息发送给当前优先级最高的消费者。
Java 代码实现
import java.util.*;public class Main {static class Event implements Comparable<Event> {int time; // 事件发生时间int type; // 0:订阅, 1:取消订阅, 2:消息int consumerIdx; // 消费者索引(用于订阅/取消)int message; // 消息内容(仅消息事件有效)public Event(int time, int type, int consumerIdx, int message) {this.time = time;this.type = type;this.consumerIdx = consumerIdx;this.message = message;}@Overridepublic int compareTo(Event other) {if (this.time != other.time) {return Integer.compare(this.time, other.time);} else {return Integer.compare(this.type, other.type); // 订阅→取消→消息}}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 解析消息输入String[] msgInput = scanner.nextLine().split(" ");List<Event> events = new ArrayList<>();for (int i = 0; i < msgInput.length; i += 2) {int time = Integer.parseInt(msgInput[i]);int msg = Integer.parseInt(msgInput[i + 1]);events.add(new Event(time, 2, -1, msg)); // 类型2是消息事件}// 解析消费者输入String[] consumerInput = scanner.nextLine().split(" ");int m = consumerInput.length / 2;List<List<Integer>> consumerMsgs = new ArrayList<>();for (int i = 0; i < m; i++) {int subTime = Integer.parseInt(consumerInput[2 * i]);int unsubTime = Integer.parseInt(consumerInput[2 * i + 1]);events.add(new Event(subTime, 0, i, -1)); // 订阅事件events.add(new Event(unsubTime, 1, i, -1)); // 取消事件consumerMsgs.add(new ArrayList<>()); // 初始化消费者的消息列表}// 按时间排序所有事件Collections.sort(events);// 维护当前活跃的消费者(按优先级降序排列)TreeSet<Integer> activeConsumers = new TreeSet<>(Collections.reverseOrder());// 处理所有事件for (Event event : events) {switch (event.type) {case 0: // 订阅事件activeConsumers.add(event.consumerIdx);break;case 1: // 取消订阅事件activeConsumers.remove(event.consumerIdx);break;case 2: // 消息事件if (!activeConsumers.isEmpty()) {int consumer = activeConsumers.first(); // 最高优先级的消费者consumerMsgs.get(consumer).add(event.message);}break;}}// 输出结果for (List<Integer> msgs : consumerMsgs) {if (msgs.isEmpty()) {System.out.println(-1);} else {System.out.println(String.join(" ", msgs.stream().map(String::valueOf).toArray(String[]::new)));}}}
}
代码解析
-
Event 类:
static class Event implements Comparable<Event> {int time; // 事件时间int type; // 0:订阅, 1:取消, 2:消息int consumerIdx; // 消费者索引int message; // 消息内容 }
- 封装事件的时间、类型、消费者索引和消息内容。
-
事件排序:
@Override public int compareTo(Event other) {if (this.time != other.time) return time比较结果;else return type比较结果; // 同一时间,订阅→取消→消息 }
- 按时间升序排序,同一时间的事件按订阅 → 取消 → 消息的顺序处理。
-
解析输入:
String[] msgInput = scanner.nextLine().split(" "); for (int i = 0; i < msgInput.length; i += 2) {int time = Integer.parseInt(msgInput[i]);int msg = Integer.parseInt(msgInput[i + 1]);events.add(new Event(time, 2, -1, msg)); // 消息事件 }
- 将输入拆分为消息时间和内容,生成消息事件。
-
处理消费者事件:
String[] consumerInput = scanner.nextLine().split(" "); for (int i = 0; i < m; i++) {int subTime = Integer.parseInt(consumerInput[2*i]);int unsubTime = Integer.parseInt(consumerInput[2*i+1]);events.add(new Event(subTime, 0, i, -1)); // 订阅事件events.add(new Event(unsubTime, 1, i, -1)); // 取消事件 }
- 解析每个消费者的订阅和取消时间,生成对应事件。
-
维护活跃消费者:
TreeSet<Integer> activeConsumers = new TreeSet<>(Collections.reverseOrder());
- 使用
TreeSet
并按逆序排序,确保活跃消费者中优先级最高的(索引最大)排在前面。
- 使用
-
处理消息事件:
if (!activeConsumers.isEmpty()) {int consumer = activeConsumers.first(); // 最高优先级消费者consumerMsgs.get(consumer)
相关文章:

华为OD机试真题——模拟消息队列(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《模拟消息队列》: 目录 题…...

MySql(十三)
目录 mysql外键约束 准备工作 创建表 插入数据 创建表时添加外键 1..格式 2..创建表student表时,为其添加外键 3.插入数据测试 正常数据 异常数据 3.使用alter添加外键 删除外键 添加外键 4.Mysql外键不生效的原因 修改引擎 phpystudy的mysql位置 mysql外键约束 注&…...

iOS —— UI 初探
简介 第一次新建时,你可能会好奇。为什么有这么多文件,他们都有什么用? App 启动与生命周期管理相关 文件名 类型 作用 main.m m 程序入口,main() 函数定义在这里 AppDelegate.h/.m h/m App 启动/进入后台/退出等全局事…...

day23-计算机网络-1
1. 网络简介 1.1. 网络介质 网线:cat5,cat5e 六类网线,七类网线,芭蕾网线光纤:wifi:无线路由器,ap5G 1.2. 常见网线类型 1.2.1. 双绞线(Twisted Pair Cable)【最常用】 按性能主…...

C语言基础(09)【数组的概念 与一维数组】
数组 数组的概念 什么是数组 数组是相同类型、有序数据的集合。 数组的特征 数组中的数据称之为数组的元素(数组中的每一个匿名变量空间,是同构的)数组中的元素存放在内存空间建立。 衍生概念:下标(索引) 下标或者索引代表…...

【JavaScript】Ajax 侠客行:axios 轻功穿梭服务器间
一、AJAX 概念和 axios 使用讲解 什么是 AJAX ? 使用浏览器的 XMLHttpRequest 对象与服务器通信 浏览器网页中,使用 AJAX技术(XHR对象)发起获取省份列表数据的请求,服务器代码响应准备好的省份列表数据给前端,前端…...

Django数据库连接报错 django.db.utils.NotSupportedError: MySQL 8 or later is required
可尝试换django版本 pip install django3.2.13 另外mysql下载地址 https://dev.mysql.com/downloads/installer/ 安装可以参考: https://blog.csdn.net/HHHQHHHQ/article/details/148125549 重点:用户变量添加 C:\Program Files\MySQL\MySQL Server …...

2025年- H57-Lc165--994.腐烂的橘子(图论,广搜)--Java版
1.题目描述 2.思路 3.代码实现 import java.util.LinkedList; import java.util.Queue;public class H994 {public int orangesRotting(int[][] grid) {//1.获取行数int rowsgrid.length;int colsgrid[0].length;//2.创建队列用于bfsQueue<int[]> quenew LinkedList<…...
2024 CKA模拟系统制作 | Step-By-Step | 16、题目搭建-sidecar 代理容器日志
目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、考点分析 1. Sidecar 容器模式 2. 共享卷配置 3. 日志流式处理 4. 容器规范修改 三、考点详细讲解 1. Sidecar 模式架构 2. 关键组件解析 3. 日志流式处理原理 四、实验环境搭建步骤 1.编辑11-factor-app…...

(9)-Fiddler抓包-Fiddler如何设置捕获Https会话
1.简介 由于近几年来各大网站越来越注重安全性都改成了https协议,不像前十几年前直接是http协议直接裸奔在互联网。接着讲解如何抓取https协议会话。 2.什么是HTTPS? HTTPS就是加过密的HTTP。使用HTTPS后,浏览器客户端和Web服务器传输的数…...

Vue-Router 基础使用
Vue Router 是 Vue 官方的客户端路由解决方案。 客户端路由的作用是在单页应用 SPA 中将浏览器的 URL 和用户看到的内容绑定起来。当用户在应用中浏览不同页面时,URL 会随之更新,但页面不需要从服务器重新加载。 Vue Router 基于 Vue 的组件系统构建&a…...

【案例分享】蓝牙红外线影音遥控键盘:瑞昱RTL8752CJF
蓝牙红外线影音遥控键盘 Remotec的无线控制键盘采用瑞昱蓝牙RTL8752CJF解决方案,透过蓝牙5.0与手机配对后,连线至 Remotec 红外 code server 取得对应影音视觉设备的红外 code后,即可控制多达2个以上的影音视觉设备,像是智能电视…...
利用SQL批量修改Nacos配置
在Nacos的应用场景中,配置信息的管理至关重要。当需要对特定的配置进行批量修改时,SQL能成为我们强大的助力工具。本文将围绕如何使用SQL语句,依据特定条件修改Nacos的config_info表配置展开讲解。 一、操作前置准备 1. 数据备份 在对conf…...

网络协议的原理及应用层
网络协议 网络协议目的为了减少通信成本,所有的网络问题都是传输距离变长的问题。 协议的概念:用计算机语言来发出不同的信号,信号代表不同的含义,这就是通信双方的共识,便就是协议。 协议分层(语言层和…...

Express教程【003】:Express获取查询参数
文章目录 3、获取URL中携带的查询参数3.1 参数形式:查询字符串3.2 参数形式:动态参数3.3 参数形式:Json数据 3、获取URL中携带的查询参数 3.1 参数形式:查询字符串 1️⃣通过req.query对象,可以访问到客户端通过查询…...
Android开发常用Kotlin高级语法
一、扩展函数与扩展属性:为系统类 “量身定制” 工具方法 Kotlin 的扩展机制允许为现有类(包括 Java 类)添加新功能,无需继承或修改原类。这在 Android 开发中尤其适合封装高频重复操作(如 View 操作、上下文获取&…...

输入ifconfig,发现ens33不见了,无法连接至虚拟机
输入ifconfig,发现ens33不见了,无法连接至虚拟机 输入ifconfig,发现ens33不见了,无法连接至虚拟机 输入ifconfig,发现ens33不见了,无法连接至虚拟机 当输入ifconfig,发现少了ens33,无…...
Android Stdio 编译 文件生成,以及Gradle
一、生成调试版 APK(无需签名) 适用于测试阶段,可直接安装到模拟器或真机调试。 编译项目 确保项目无错误(菜单栏 → Build → Make Project 或按 Ctrl F9)。 生成 APK 点击菜单栏 Build → Generate App Bundles o…...
前端面试准备-4
1.React Router的history模式中,push和replace有什么区别 都是用于页面导航,但是他们对浏览器历史记录的处理不一样。 ①:push是在浏览历史栈里加入一条新的浏览历史,点击返回键会返回上一个页面 ②;replace是替换当前历史记录…...
AI赋能金融风控:基于机器学习的智能欺诈检测系统实战教程
引言 在数字化转型浪潮中,金融欺诈手段呈现智能化、隐蔽化趋势。传统规则引擎已难以应对复杂多变的欺诈模式,而机器学习技术通过自动学习数据特征,正在重塑金融风控体系。本文将基于Python生态,以信用卡欺诈检测为切入点…...

Java虚拟机内存区域划分
Java虚拟机内存区域划分 Java虚拟机(JVM)的内存区域划分主要分为五个部分: 程序计数器:程序计数寄存器,给CPU使用本地方法栈:为JVM使用到的Native方法服务方法区:存储的是编译后的.class文件堆…...
如何下载python的第三方类库
无论是在cmd中(使用python环境),还是在Anaconda Prompt中(使用虚拟环境),都可以通过pip命令进行下载python的第三方类库。 pip install packagename --default-timeout600 -i https://mirrors.tuna.tsingh…...
Redis击穿,穿透和雪崩详解以及解决方案
在 Java 开发中,Redis 作为常用的缓存中间件,可能会面临击穿、穿透、雪崩这三类经典问题。以下是对这三个问题的详细解析及对应的 Java 解决方案: 一、Redis 缓存击穿(Cache Breakdown) 问题描述 定义:大…...

网络渗透基础:信息收集
1.信息收集 whois xx.com 域名注册信息 注册人、电话、email Whois.chinaz.com kali自带whois工具 域名备案信息 Beian.miit.gov.cn Tianyancha.com Icp.chinaz.com 爱站 Sou.xiaolanben.com 2.子域名收集 收集方式 枚举:基于字典搜索引擎:googleh…...

[SAP] 如何查询当前屏幕的Tcode?
事务代码Tcode是SAP中到达特定屏幕的快捷路径 如何查询以下屏幕的事务码Tcode? 要浏览当前所使用的屏幕的事务码,可以选择System | Status 这里的事务代码是[VA22],它是Change Quotation的事务代码...

ZigBee 协议:开启物联网低功耗通信新时代
在物联网蓬勃发展的时代,无线通信技术犹如连接万物的桥梁,而 ZigBee 协议以其独特的优势,在众多通信协议中脱颖而出,成为构建低功耗、可靠物联网网络的关键技术之一。 一、ZigBee 协议的起源与发展 ZigBee 这个名字充满了自然的灵…...

JavaScript 模块系统:CJS/AMD/UMD/ESM
文章目录 前言一、CommonJS (CJS) - Node.js 的同步模块系统1.1 设计背景1.2 浏览器兼容性问题1.3 Webpack 如何转换 CJS1.4 适用场景 二、AMD (Asynchronous Module Definition) - 浏览器异步加载方案2.1 设计背景2.2 为什么现代浏览器不原生支持 AMD2.3 Webpack/Rollup 如何处…...

STM32F407寄存器操作(ADC非连续扫描模式)
1.前言 书接上回,在看手册的时候我突然发现手册上还描述了另一种ADC扫描模式,即非连续扫描模式,想着连续扫描模式都已经探索过了,那就顺手把非非连续模式研究一下吧。 2.理论 我们先看看手册,这里我就以规则通道举例…...
生产系统中TongWeb故障应急处理办法
本文档主要说明在上线正式运行的系统中,若TongWeb或部署在TongWeb上的应用出现问题时,现场维护人员或在现场的TongWeb支持人员应当采取的处理步骤。 工作基本原则: 任何操作必须经过项目相关负责人同意后进行,禁止在未允许的情况…...

PHP学习笔记(十一)
类常量 可以把在类中始终保持不变的值定义为常量,类常量的默认可见性是public。 接口中也可以定义常量。 可以用一个变量来动态调用类,但该变量的值不能为关键字 需要注意的是类常量只为每个类分配一次,而不是为每个类的实例分配。 特殊的…...