华为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
限定语言不限

题目描述

模拟一个消息队列的运作,包含一个发布者和若干消费者。发布者在特定时刻发送消息,若此时有消费者订阅,消息将发送给优先级最高的消费者(消费者按输入顺序升序排列,升序即优先级递增)。若没有订阅者,消息被丢弃。消费者在特定时刻订阅或取消订阅,同一时刻的事件处理顺序如下:

  • 订阅操作优先于消息发送
  • 取消订阅优先于消息发送

输入描述
输入为两行:

  1. 第一行:2N个正整数,表示N条消息的发送时刻和内容(时刻不重复,但未按时间排序)。例如:2 22 1 11 4 44代表3条消息,时刻分别为2(内容22)、1(内容11)、4(内容44)。
  2. 第二行:2M个正整数,表示M个消费者的订阅和取消订阅时刻。例如:1 7 2 3代表两个消费者,第一个订阅时刻1、取消时刻7;第二个订阅时刻2、取消时刻3。

输出描述
输出M行,每行为对应消费者收到的消息内容(按接收顺序排列),若未收到消息则输出-1

测试用例

  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依次处理,优先级高的消费者(后订阅的)优先接收消息。

  2. 输入

    5 64 11 64 9 97  
    9 11 4 9  
    

    输出

    97  
    64  
    

Java

问题分析

我们需要模拟消息队列的工作流程,其中发布者在特定时刻发送消息,消费者在特定时刻订阅或取消订阅。消息发送时,优先发送给当前活跃且优先级最高的消费者。优先级由消费者的输入顺序决定,后订阅的消费者优先级更高。


解决思路

  1. 事件收集与排序:将所有订阅、取消订阅、消息发送事件按时间排序,同一时刻的事件按订阅 → 取消 → 消息的顺序处理。
  2. 维护活跃消费者:使用 TreeSet 维护当前活跃的消费者,按优先级(输入顺序的逆序)排序。
  3. 消息分发:处理消息事件时,将消息发送给当前优先级最高的消费者。

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)));}}}
}

代码解析

  1. Event 类

    static class Event implements Comparable<Event> {int time;       // 事件时间int type;       // 0:订阅, 1:取消, 2:消息int consumerIdx; // 消费者索引int message;     // 消息内容
    }
    
    • 封装事件的时间、类型、消费者索引和消息内容。
  2. 事件排序

    @Override
    public int compareTo(Event other) {if (this.time != other.time) return time比较结果;else return type比较结果; // 同一时间,订阅→取消→消息
    }
    
    • 按时间升序排序,同一时间的事件按订阅 → 取消 → 消息的顺序处理。
  3. 解析输入

    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)); // 消息事件
    }
    
    • 将输入拆分为消息时间和内容,生成消息事件。
  4. 处理消费者事件

    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)); // 取消事件
    }
    
    • 解析每个消费者的订阅和取消时间,生成对应事件。
  5. 维护活跃消费者

    TreeSet<Integer> activeConsumers = new TreeSet<>(Collections.reverseOrder());
    
    • 使用 TreeSet 并按逆序排序,确保活跃消费者中优先级最高的(索引最大)排在前面。
  6. 处理消息事件

    if (!activeConsumers.isEmpty()) {int consumer = activeConsumers.first(); // 最高优先级消费者consumerMsgs.get(consumer)

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

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

相关文章

LangChain-结合GLM+SQL+函数调用实现数据库查询(三)

针对 LangChain-结合GLM+SQL+函数调用实现数据库查询(二)-CSDN博客 进一步简化 通过 LangChain 和大语言模型(GLM-4)实现了一个 AI 代理,能够根据自然语言提问自动生成 SQL 查询语句,并连接 MySQL 数据库执行查询,最终返回结果。 整个流程如下: 用户提问 → AI 生成 SQ…

ZLG ZCANPro,ECU刷新,bug分享

文章目录 摘要 📋问题的起因bug分享 ✨思考&反思 🤔摘要 📋 ZCANPro想必大家都不陌生,买ZLG的CAN卡,必须要用的上位机软件。在汽车行业中,有ECU软件升级的需求,通常都通过UDS协议实现程序的更新,满足UDS升级的上位机要么自己开发,要么用CANoe或者VFlash,最近…

第2期:APM32微控制器键盘PCB设计实战教程

第2期&#xff1a;APM32微控制器键盘PCB设计实战教程 一、APM32小系统介绍 使用apm32键盘小系统开源工程操作 APM32是一款与STM32兼容的微控制器&#xff0c;可以直接替代STM32进行使用。本教程基于之前开源的APM32小系统&#xff0c;链接将放在录播评论区中供大家参考。 1…

单元测试-断言常见注解

目录 1.断言 2.常见注解 3.依赖范围 1.断言 断言练习 package com.gdcp;import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test;//测试类 public class UserServiceTest {Testpublic void testGetGender(){UserService userService new UserService…

每日算法-250602

每日算法学习记录 - 250602 今天学习和复习了两道利用前缀和与哈希表解决的子数组问题&#xff0c;特此记录。 560. 和为 K 的子数组 题目 思路 本题的核心思想是利用 前缀和 与 哈希表 来优化查找过程。 解题过程 题目要求统计和为 k 的子数组个数。 我们首先预处理出一…

Arch安装botw-save-state

devkitPro https://blog.csdn.net/qq_39942341/article/details/148387077?spm1001.2014.3001.5501 cargo https://blog.csdn.net/qq_39942341/article/details/148387783?spm1001.2014.3001.5501 megaton https://blog.csdn.net/qq_39942341/article/details/148388164?spm…

STM32学习笔记---时钟树

目录 一、时钟树&#xff1a;M3---STM32F103 1、主要时钟来源 ​2、时钟系统线路分析 HSE时钟 HSI时钟 LSE时钟 LSI时钟 PPLCLK ---锁相环时钟 SYSCLK ---系统时钟 HCLK时钟 PCLK1时钟 PCLK2时钟 3、时钟树简图 4、构成部分作用分析 二、时钟树&#xff1a;M4-…

35.x64汇编写法(二)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;34.x64汇编写法&#xff08;一&#xff09; 上一个内容写了&#xff0c;汇编调…

钩子函数的作用(register_hook)

钩子函数仅在backward()时才会触发。其中&#xff0c;钩子函数接受梯度作为输入&#xff0c;返回操作后的梯度&#xff0c;操作后的梯度必须要输入的梯度同类型、同形状&#xff0c;否则报错。 主要功能包括&#xff1a; 监控当前的梯度&#xff08;不返回值&#xff09;&…

【头歌实验】Keras机器翻译实战

【头歌实验】Keras机器翻译实战 第1关&#xff1a;加载原始数据 编程要求 根据提示&#xff0c;在右侧编辑器补充代码&#xff0c;实现load_data函数&#xff0c;该函数需要加载path所代表的文件中的数据&#xff0c;并将文件中所有的内容按\n分割&#xff0c;转换成一个列表…

python中使用高并发分布式队列库celery的那些坑

python中使用高并发分布式队列库celery的那些坑 &#x1f31f; 简单理解&#x1f6e0;️ 核心功能&#x1f680; 工作机制&#x1f4e6; 示例代码&#xff08;使用 Redis 作为 broker&#xff09;&#x1f517; 常见搭配&#x1f4e6; 我的环境&#x1f4e6;第一个问题&#x1…

截图工具 Snipaste V2.10.7(2025.06.2更新)

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VORklK9hcuoI6n_qgx25jSq2A1?pwde7bi# 【​本章下载二】&#xff1a;https://pan.quark.cn/s/7c62f8f86735 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…

batch_size 参数最优设置

在深度学习训练中,batch_size(批量大小)的选择是一个需要权衡的问题,既不是越大越好,也不是越小越好,而是需要根据硬件资源、数据规模、模型复杂度和优化目标等因素综合决定。以下是详细分析:

【agent开发】部署LLM(一)

本周基本就是在踩坑&#xff0c;没什么实质性的进展 下载模型文件 推荐一个网站&#xff0c;可以简单计算下模型推理需要多大显存&#xff1a;https://apxml.com/tools/vram-calculator 我的显卡是RTX 4070&#xff0c;有12GB的显存&#xff0c;部署一个1.7B的Qwen3应该问题…

大数据-274 Spark MLib - 基础介绍 机器学习算法 剪枝 后剪枝 ID3 C4.5 CART

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大模型篇章已经开始&#xff01; 目前已经更新到了第 22 篇&#xff1a;大语言模型 22 - MCP 自动操作 FigmaCursor 自动设计原型 Java篇开…

flutter常用动画

Flutter 动画基础概念 术语解释Animation表示动画的值&#xff0c;通常是一个 double (0.0 ~ 1.0) 或其他数值。AnimationController管理动画的时间进度和状态。需要 Ticker (vsync) 来驱动。Tween定义动画的取值范围&#xff0c;如从 0.0 到 1.0&#xff0c;从红色到蓝色。Cu…

Python打卡DAY43

复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 我选择ouIntel Image Classification | Kagglezz&#xff0c;该数据集分为六类&#xff0c;包含建筑、森林、冰川、山脉、海洋和街道…

从多巴胺的诱惑到内啡肽的力量 | 个体成长代际教育的成瘾困局与破局之道

注&#xff1a;本文为“多巴胺&#xff0c;内啡肽”相关文章合辑。 图片清晰度受引文原图所限。 略作重排&#xff0c;未整理去重。 如有内容异常&#xff0c;请看原文。 年少偏爱多巴胺&#xff0c;中年才懂内啡肽 摘要 &#xff1a;本文通过生活实例与科学研究相结合的方式…

【音视频】H265 NALU分析

1 H265 概述 H264 与 H265 的区别 传输码率&#xff1a;H264 由于算法优化&#xff0c;可以低于 2Mbps 的速度实现标清数字图像传送&#xff1b;H.265 High Profile 可实现低于 1.5Mbps 的传输带宽下&#xff0c;实现 1080p 全高清视频传输。 编码架构&#xff1a;H.265/HEVC…

Python训练营打卡 Day26

知识点回顾&#xff1a; 函数的定义变量作用域&#xff1a;局部变量和全局变量函数的参数类型&#xff1a;位置参数、默认参数、不定参数传递参数的手段&#xff1a;关键词参数传递参数的顺序&#xff1a;同时出现三种参数类型时 ——————————————————————…