华为OD机试真题——模拟消息队列(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

article/2025/6/17 0:57:42

在这里插入图片描述

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.hkcw.cn/article/WeQYjHWEIN.shtml

相关文章

Nacos 配置文件总结

Nacos 配置文件总结 文章目录 Nacos 配置文件总结1 、在 Nacos 服务端添加配置文件1. 启动Nacos Server。2. 新建配置文件。3. 发布配置集后&#xff0c;我们便可以在配置列表中查看相应的配置文件。4. 配置nacos数据库5. 运行 Nacos 容器6. 验证安装结果7. 配置验证 2 、在 Na…

一文读懂MCP模型上下文协议

前言&#xff1a;MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;作为一个全新的开源协议框架被提出&#xff0c;它试图重塑模型开发、集成与协作的方式。MCP让只能人机交互的大模型转化为了能够快速对接各类业务系统的生产力大脑。传统做法通常…

C#数字图像处理(一)

文章目录 1.C#图像处理基础1.1 Bitmap类1.2 Bitmapdata类1.3 Graphics类1.4 Image类 2.彩色图像灰度化1.提取像素法2.内存法3.指针法三种方法的比较4.灰度图像二值化&#xff1a; 3.相关链接 Bitmap类、 Bitmapdata类和 Graphics类是C#图像处理中最重要的3个类,如果要用C# 进行…

各种数据库,行式、列式、文档型、KV、时序、向量、图究竟怎么选?

慕然回首&#xff0c;发现这些年来涌现出了许多类型的数据库&#xff0c;今天抽空简单回顾一下&#xff0c;以便于后面用到时能快速选择。 1. 关系型数据库(行式) 关系型数据库&#xff08;RDBMS&#xff09;&#xff0c;我们常说的数据库就是指的关系型数据库。 它的全称是关…

uView UI的使用

1. uView UI 封装了request.get登方法请求&#xff0c;异步调用。 故需可以使用then, catch, finally uView UI. 是一个专为UniApp设计的跨平台UI框架, 注意这里是跨平台&#xff0c;也就是可以再IOS, ANDROID 机器上运行的框架 2. easycom 词面意思容易使用的组件 在使用…

win32相关(临界区)

临界区 每个线程都有自己的栈&#xff0c;而局部变量是存在在栈中的&#xff0c;这就意味着每个线程都有一份自己的”局部变量“&#xff0c;如果线程仅仅只是使用自己的”局部变量“那么就不会有线程安全问题&#xff0c;那如果多个线程使用一个全局变量呢&#xff1f; 我们用…

UE5蓝图暴露变量,在游戏运行时修改变量实时变化、看向目标跟随目标Find Look at Rotation、修改玩家自身弹簧臂

UE5蓝图中暴露变量&#xff0c;类似Unity中public一个变量&#xff0c;在游戏运行时修改变量实时变化 1&#xff0c;添加变量 2&#xff0c;设置变量的值 3&#xff0c;点开小眼睛&#xff0c;此变量显示在编辑器中&#xff0c;可以运行时修改 看向目标跟随目标Find Look at R…

112 Gbps 及以上串行链路的有效链路均衡

通道均衡已成为当今高速串行链路的关键机制。目前有许多均衡方案&#xff0c;例如发射机加重均衡、接收机CTLE&#xff08;连续时间线性均衡器&#xff09;、FFE&#xff08;前馈均衡器&#xff09;、DFE&#xff08;判决反馈均衡器&#xff09;和FEC&#xff08;前向纠错&…

【LLM相关知识点】关于LangChain框架学习简单整理(三)

【LLM相关知识点】关于LangChain框架学习简单整理&#xff08;三&#xff09; 一、核心模块和协作模式 参考极简LangChain智能体开发入门指南&#xff0c;LangChain官方文档 LangChain核心模块与功能&#xff1a; 核心模块功能描述关键技术点​模型I/O管理大模型输入输出&a…

基于CangjieMagic的RAG技术赋能智能问答系统

目录 引言 示例程序分析 代码结构剖析 导入模块解读 智能体配置详情 提示词模板说明 主程序功能解析 异步聊天功能实现 检索信息展示 技术要点总结 ollama 本地部署nomic-embed-text 运行测试 结语 引言 这段时间一直在学习CangjieMagic。前几天完成了在CangjieMa…

【速通RAG实战:进阶】18、如何利用LLM记忆功能,实现一对一的个性化服务

一、赛博记忆的本质:从数据到数字人格的进化 (一)核心概念与技术定位 赛博记忆(Cyber Memory)是通过AI技术将个人多源数据(文本、图像、生物特征等)转化为可交互的动态记忆系统,其终极目标是构建可进化的数字人格,实现记忆的存储、重构与智能响应。与传统数据存储不…

C++深入类与对象

在上一篇中提到了构造函数&#xff0c;那么这篇再来提一下构造函数&#xff0c;编译器自动生成的默认构造函数对于内置类型不做处理&#xff0c;自定义类型会调用它自己的构造函数。对于自己写的构造函数&#xff0c;之前是在函数体中初始化&#xff0c;当然不止这一种初始化&a…

创新型老年综合评估实训室建设方案:提升评估实训精准性

随着人口老龄化加剧&#xff0c;老年综合评估人才需求激增&#xff0c;建设创新型老年综合评估实训室&#xff0c;是提升评估实训精准性、培育专业人才的关键路径。点击获取实训室建设方案 一、建设背景与意义 &#xff08;一&#xff09;行业发展需求 1、老龄化社会对老年综…

凤凰古城举行端午抢鸭子活动 欢乐江中庆佳节

5月31日,湖南凤凰古城沱江上举行了一场备受期待的“抢鸭子”大赛。500只精心挑选的鸭子被投入江中,其中一些鸭子颈项间系着鲜艳红绸带,象征好运。随着一声悠长的吆喝声响起,早已准备好的参赛者们纷纷跃入清凉的江水中。现场瞬间变成了欢乐的海洋,游客和市民一同沉浸在浓厚…

【深度学习】16. Deep Generative Models:生成对抗网络(GAN)

Deep Generative Models&#xff1a;生成对抗网络&#xff08;GAN&#xff09; 什么是生成建模&#xff08;Generative Modeling&#xff09; 生成模型的主要目标是从数据中学习其分布&#xff0c;从而具备“生成”数据的能力。两个关键任务&#xff1a; 密度估计&#xff0…

卢伟冰:诋毁本身就是一种仰望 小米汽车成功之道

小米集团合伙人、总裁卢伟冰昨晚谈到了小米汽车的成功。他表示,无论是SU7的热销还是YU7获得更高关注和期待,都基于强大的产品力。小米以“十倍投入做一辆好车”的决心,赢得了千万网友的认可。卢伟冰强调,小米汽车的成功体现了小米的价值观、模式和方法论。他还引用了莫言的…

西安交大原校长徐通模逝世 沉痛悼念与缅怀

沉痛悼念并深切缅怀徐通模同志。中国共产党优秀党员、西安交通大学原校长、我国动力工程与工程热物理领域著名专家、西安交通大学能源与动力工程学院热能工程系徐通模教授,因病医治无效,于2025年5月31日下午14时16分在西安逝世,享年86岁。徐通模同志1939年11月生于江苏如皋,…

性能优化 - 理论篇:常见指标及切入点

文章目录 引言一、 Java 性能优化的核心思路二、为什么要度量&#xff1f;三、常用性能衡量指标详解3.1 吞吐量与响应速度3.2 响应时间的具体度量&#xff1a;平均响应时间与百分位数3.3 并发量3.4 秒开率&#xff08;页面秒开&#xff09;3.5 正确性&#xff08;功能可用性&am…

Java代码重构:如何提升项目的可维护性和扩展性?

Java代码重构&#xff1a;如何提升项目的可维护性和扩展性&#xff1f; 在Java开发领域&#xff0c;随着项目规模的不断扩大和业务需求的频繁变更&#xff0c;代码的可维护性和扩展性逐渐成为了项目成功的关键因素。代码重构作为一种优化代码质量的重要手段&#xff0c;能够在…

【数据集】全球无缝高分辨率1 km 月均地表温度和气温(2001-2020)

目录 数据概述一、输入数据(Input Data)二、模型处理(Modeling and Processing)2.1 清空缺值重建(Clear-sky Ts Reconstruction)2.2 多云条件下地表温度重建(Cloudy-sky Ts Reconstruction)2.3 近地表气温估算(Ta Estimation)2.4 准确性验证与对比三、输出结果与产品…