華為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
繁體地址,請注明出處:http://hk.pswp.cn/web/82287.shtml
英文地址,請注明出處:http://en.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;同時出現三種參數類型時 ——————————————————————…