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

article/2025/6/17 12:11:33

在这里插入图片描述

2025 B卷 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/QIuyLPIDkX.shtml

相关文章

自称有两栋楼征婚者回应质疑 非炒作求偶遇

在广州天河猎德村举行的龙舟招景盛会上,一名脖子上挂着“两栋楼,海珠,未婚”牌子的男子引起了网络关注。这名林姓男子是广州海珠区仑头人,1990年出生,身高超过1米7,已经单身三年。林先生表示,他并非想炒作当网红,而是希望通过网络征婚找到合适的另一半。他解释说,在盛…

郑钦文:输球更多是自己原因 心态需更稳

北京时间6月3日,2025年法网女单1/4决赛中,郑钦文以0-2的比分不敌萨巴伦卡,未能晋级四强。赛后,她接受了采访。郑钦文表示,一开始上场时状态不错,但主要是自己的原因导致失利。在领先时给了对手太多非受迫性失误,包括发球和关键时刻的双误。面对压力时处理得不够好,这是…

没想到在杨子身上看到了演技 影帝潜力初现

大家印象里的杨子是一个什么样的人?我谈谈我对杨子的认知。之前杨子在我心中是一个霸总,是带资进组的董永。但看完他在《再见爱人4》中的表现后,他变成了一个特别让人费解的人。尤其是录完节目后,他在直播间向黄圣依求婚,这种抽象的行为让我感到震惊。因此,我对杨子的印象…

郑钦文连续3年大满贯被萨巴横扫 关键球处理成胜负手

在法网女单1/4决赛中,郑钦文以0-2的比分不敌萨巴伦卡,未能晋级四强。近三年来,郑钦文在大满贯赛事中三次遭遇萨巴伦卡,均被横扫出局。2023年美网八强赛、2024年美网以及今年的法网,郑钦文在这三场比赛中都未能战胜对手。双方实力差距明显,特别是在关键球处理上,这是郑钦…

15岁少年因发出笑声遭路人围殴 误会引发暴力事件

昨晚,四川古蔺县公安局发布警情通报。5月26日,古蔺县公安局东城派出所接到群众报警,称熊某于24日被他人殴打,警方随即展开调查。经调查发现,2025年5月24日凌晨4时许,黄某某(15岁)和熊某(15岁)骑车经过金兰大道税务局路段时发出笑声,路边的陈某甲(15岁)误以为他们在…

【 SpringCloud | 微服务 网关技术 】

单体架构时我们只需要完成一次用户登录、身份校验&#xff0c;就可以在所有业务中获取到用户信息。而微服务拆分后&#xff0c;每个微服务都独立部署&#xff0c;这就存在一些问题&#xff1a; 每个微服务都需要编写登录校验、用户信息获取的功能吗&#xff1f; 当微服务之间调…

深圳警方通报一女子大厦高坠死亡 排除刑事案件

6月3日,深圳市公安局龙华分局发布警情通报。6月2日上午9时左右,一名21岁的女子陈某某在龙华区宁远路附近某大厦高坠身亡。经现场勘查、走访调查及视频排查证实,陈某某于6月1日从外省来到深圳,次日早上7时30分许步行至该大厦,并独自乘电梯到30楼徘徊停留。8时51分,她自行翻…

乌军蛛网行动战果到底如何 俄方称其为“谎言蛛网”

俄罗斯“与假新闻作战”网站发布文章指出,通过分析乌克兰方面发布的视频可以确认,乌总统泽连斯基声称“已摧毁34%俄罗斯远程机队”的说法并不属实。俄方认为,乌方的行动更像是编织了一个“谎言蛛网”。俄方分析显示,乌克兰实际上可能只摧毁了两架图-95战略轰炸机和一架安-1…

Ubuntu 安装 Cursor

Cursor 目前只有 Windows 和 Mac 版本&#xff0c;那么如何在 Ubuntu 上运行呢&#xff1f; 本质上是一个如何在 Ubuntu 运行 .appimage 的问题。 1. 下载 Cursor Linux 首先找到 Cursor 官网&#xff0c;下载 x64 安装包&#xff0c;如果你是 arm 架构&#xff0c;就下载 ar…

在Ubuntu22.04 配置安装Dify Ollma 以及Deepseek配置

在Ubuntu22.04 配置安装Dify Ollma 以及Deepseek配置 文章目录 在Ubuntu22.04 配置安装Dify Ollma 以及Deepseek配置前言一、安装docker以及docker compose1. 更新软件包2. 安装docker依赖3. 添加docker密钥4.添加阿里云docker软件源5.安装docker和docker compose6.配置用户组(…

Ubuntu+Docker实战:手把手教你整合MyIP与cpolar实现内网穿透

文章目录 前言1.关于 MyIP2.Docker 部署3.MyIP 简单使用4.安装 cpolar 内网穿透5. 配置公网地址6. 配置固定公网地址总结 前言 技术探索者们请注意&#xff01;我们即将揭晓一项突破性网络技术方案——MyIP 系统&#xff01;这项创新技术颠覆了传统网络部署模式&#xff0c;即…

Ubuntu 22的安装,换源和配置(详细)

目录 1.安装 1.1.打开虚拟机 1.2.选择语言 1.3.版本更新 &#xff08;跳过即可&#xff09; 1.4. 键盘配置 1.5.选择安装类型 1.6.网络配置 1.7.配置代理 1.8.引导式存储布局配置 1.9.配置用户信息 1.10.安装OpenSSH服务包 1.11.选择安装服务软件包 2.换源和配…

使用Ubuntu快速部署MinIO对象存储

想拥有自己的私有云存储&#xff0c;安全可靠又高效&#xff1f;MinIO是你的理想选择&#xff01;这篇文章将手把手教你如何在Ubuntu 22.04服务器上部署MinIO&#xff0c;并使用Nginx反向代理和Let’s Encrypt证书进行安全加固。 即使你是新手&#xff0c;也能轻松完成&#xf…

ubuntu中使用ollama部署本地deepseek

ubuntu中使用ollama部署本地deepseek 一、安装Docker 1、先卸载旧版&#xff0c;如果没有的话&#xff0c;就不用执行了&#xff0c;直接第二步。 apt-get remove docker docker-engine docker.io containerd runc 2、在终端输入 apt update apt-get install ca-certifica…

Ubuntu 24.04.2 LTS 桌面版系统安装、分区、配置全记录

引言 记录了一次完整的系统安装与环境配置过程&#xff0c;包括启动盘制作、安装引导、镜像源替换、中文输入法配置、驱动和CUDA安装、docker安装和完整配置过程、SSH配置、软件安装&#xff08;App Store软件安装与其他软件安装&#xff0c;以VScode和Mathlab为例&#xff09…

Ubuntu 22.04下Docker安装(最全指引)

0-1开始Java语言编程之路 一、Ubuntu下Java语言环境搭建 | MacOS下使用Jenv管理多JDK版本 二、Ubuntu下Docker环境安装 | MacOS下Docker安装与配置 三、使用Docker搭建本地Nexus Maven私有仓库 四、Ubuntu下使用VisualStudioCode进行Java开发 五、从Swagger到OpenAPI&#xff0…

[Ubuntu]安装ollama操作记录

安装ollama操作记录 简介 Ollama 是一个致力于推动本地人工智能模型开发和应用的工具和平台&#xff0c;允许用户在本地运行、管理和调用各种 AI 模型。它的核心理念是提供一种无需依赖云计算环境的方式&#xff0c;让开发者和企业能够高效地使用 AI 模型&#xff0c;同时确保数…

AI全栈之路:Ubuntu云服务器部署Spring + Vue + MySql

背景介绍 之前使用AI代码工具Trae基于Spring Vue MySql生成了一个输入要做事情AI自动生成待办任务列表的的小工具&#xff0c;效果如下&#xff1a; 本地跑通后正好有一台阿里云服务器和域名&#xff0c;准备把这个项目部署到云服务器实现远程访问&#xff0c;本文记录部署…

IsaacLab最新2025教程-环境配置(IsaacSim 4.5.0/Ubuntu22.04) 原创

拖了几个月&#xff0c;终于录了一个安装视频在b站&#xff1a; IsaacLab最新2025教程-环境配置(IsaacSim 4.5.0/Ubuntu22.04) 原创_哔哩哔哩_bilibili IsaacLab的官方入门教程专栏会不断更新哈&#xff1a; IsaacLab教程2025_Calm_dw的博客-CSDN博客 Update 最近看大家的…

在Ubuntu22.04上部署ComfyUI

ComfyUI 是 一个基于节点流程的 Stable Diffusion 操作界面&#xff0c;可以通过流程&#xff0c;实现了更加精准的工作流定制和完善的可复现性。每一个模块都有特定的的功能&#xff0c;我们可以通过调整模块连接达到不同的出图效果&#xff0c;特点如下&#xff1a; 1.对显存…