【华为OD题库-012】模拟消息队列-Java
题目
让我们来模拟一个消息队列的运作,有一个发布者和若干消费者 ,发布者会在给定的时刻向消息队列发送消息。>若此时消息队列有消费者订阅,这个消息会被发送到订阅的消费者中优先级最高(输入中消费者按优先级升序排列)的一个。>若此时没有订阅的消费者,该消息被消息队列丢弃。消费者则会在给定的时刻订阅消息队列或取消订阅。当消息发送和订阅发生在同一时刻时,先处理订阅操作,即同一时刻订阅的消费者成为消息发送的候选。当消息发送和取消订阅发生在同一时刻时,先处理取消订阅操作,即消息不会被发送到同一时刻取消订阅的消费者。
输入描述
输入为两行
第一行为2N个正整数,代表发布者发送的N个消息的时刻和内容。为方便解折,消息内容也用正整数表示)。第一个数字是第一个消息的发送时刻,第二个数字是第一个消息的内容,以此类推。用例保证发送时刻不会重复,但注意消息并没有按照发送时刻排列。
第二行为2M个正整数,代表M个消费者订阅和取消订阅的时刻。第一个数字是第一个消费者订阅的时刻,第二个数字是第一个消费者取消订阅的时刻,以此类推。用例保证每个消费者的取消订阅时刻大于订阅时刻,消费者按优先级升序排列
两行的数字都由空格分隔。N不超过100,M不超过10, 每行的长度不超过1000字符.
输出描述
输出为M行,依次为M个消费者收到的消息内容,消息内容按收到的顺序排列,且由空格分隔:若某个消费者没有收到任何消息,则对应的行输出-1.
示例1:
输入
2 22 1 11 4 44 5 55 3 33
1 7 2 3
输出
11 33 44 55
22
说明
消息11在1时刻到达,此时只有第一个消费者订阅, 消息发送给它;
消息22在2时刻到达,此时两人消费者都订阅了,消息发送给优先级最高的第2二个消费者;
消息33在时刻3到达,此时只有第一个消费者订阅, 消息发送给它;
余下的消息按规则也是发送给第一个消费者
示例2:
输入
5 64 11 64 9 97
9 11 4 9
输出
97
64
消息64在5时刻到达,此时只有第二个消费者订阅, 消息发送给它
消息97在9时刻到达,此时只有第一消费者订阅(因为第二个消费者刚好在9时刻取消订阅),消息发送给它。
11时刻也到达了一个内容为64的消息,不过因为没有消费者订阅,消息被丢弃
思路
题目要求消息内容按收到的顺序排列,所以首先需要将消息按照发送时间排序,比如示例1的消息2 22 1 11 4 44 5 55 3 33排序后的结果应该是:1 11 2 22 3 33 4 44 5 55.
对排序后的消息队列,遍历所有时刻,(i=0;i<len;i+=2),如果这个时刻在[订阅,取消订阅区间内),注意根据题目要求是左闭右开的区间,那么消息有可能发送给这个订阅者。
当存在多个区间满足上述条件时,需要选择高优先级的订阅者,即靠右边的订阅者。也就是说,可以从右边订阅者开始找,找到第一个满足条件的区间,那么消息将发送给该区间对应的订阅者。
最后的结果是要返回每个订阅者接收到的消息,消息有可能是多个,所以可以用一个二维数组来存储结果:String[][] res。
定义:第一行输入代表消息队列,存入的String[] messages;第二行输入代表订阅者,存入String [] subscriber
- 先将messages按照发送时间排序
- 外层遍历messages,(i=0;i<messages.length-1;i+=2),messages[i]代表发送时刻,messages[i+1]代表该时刻发送的消息。
- 内存遍历subscriber;从右向左遍历(j=subscriber.length - 2;j>=0;j -=2),subscriber[j]代表第j/2个订阅者订阅的时刻,subscriber[j+1]代表第j/2个订阅者取消订阅的时刻。
- 找到第一个满足条件的订阅区间,也就是如果不满足条件,j继续向左移动。不满足条件的区间表达式为:messages[i] < subscriber[j] || messages[i] >= subscriber[j + 1],即消息发送时间不在订阅区间内(左闭右开)
- 找到满足条件的区间后,需要将消息messages[i+1]存在第j/2个订阅者中。res[j/2]也是一个数组,代表第j/2个订阅者收到的消息列表,现在需要考虑当前得到的消息应该存在res[j/2]中的哪个索引位置。很明显,如果是第一个消息,那么我们就存放在第一个位置,第二个消息,就存放第二个位置,以此类推。所以需要一个变量来记录当前消费者收到了多少个消息。我们可以用res[j/2][0]来存储第j/2个消费者收到的消息数量,res[j/2][1-n]来存放第j/2个消费者收到的第1~n个消息。
- 得到res后,再遍历打印输出即可。注意如果res[i][0]=0,那么代表第i个消费者接收到的消息数量为0,该消费者应该输出-1。
题解
package hwod;import java.util.Arrays;
import java.util.Scanner;public class SimulationMessageQueue {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String line1 = sc.nextLine();String line2 = sc.nextLine();int[] s1 = Arrays.stream(line1.split(" ")).mapToInt(Integer::parseInt).toArray();int[] s2 = Arrays.stream(line2.split(" ")).mapToInt(Integer::parseInt).toArray();String[] res = getMessages(s1, s2);for (int i = 0; i < res.length; i++) {System.out.println(res[i]);}}private static String[] getMessages(int[] s1, int[] s2) {for (int i = 0; i < s1.length - 3; i += 2) {for (int j = i + 2; j < s1.length - 1; j += 2) {if (s1[i] > s1[j]) {switchLocation(i, j, s1);switchLocation(i + 1, j + 1, s1);}}}int len = s2.length / 2, messageMaxSize = s1.length / 2;int[][] res = new int[len][messageMaxSize + 1];for (int i = 0; i < s1.length - 1; i += 2) {int j = s2.length - 2;while (j >= 0 && (s1[i] < s2[j] || s1[i] >= s2[j + 1])) j -= 2;if (j >= 0) {res[j / 2][1 + res[j / 2][0]++] = s1[i + 1];}}String[] ans = new String[len];for (int i = 0; i < len; i++) {int curSize = res[i][0];if (curSize == 0) {ans[i] = "-1";continue;}StringBuilder sb = new StringBuilder();for (int j = 1; j <= curSize; j++) {if (j != 1) sb.append(" ");sb.append(res[i][j]);}ans[i] = sb.toString();}return ans;}private static void switchLocation(int i, int j, int[] s1) {int temp = s1[i];s1[i] = s1[j];s1[j] = temp;}
}
推荐
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。
相关文章:
【华为OD题库-012】模拟消息队列-Java
题目 让我们来模拟一个消息队列的运作,有一个发布者和若干消费者 ,发布者会在给定的时刻向消息队列发送消息。>若此时消息队列有消费者订阅,这个消息会被发送到订阅的消费者中优先级最高(输入中消费者按优先级升序排列)的一个。>若此时…...
Android修行手册 - 阴影效果的几种实现以及一些特别注意点
点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列点击跳转>ChatGPT和AIGC 👉关于作者 专…...
【星海出品】SDN neutron (五) openvswitch
1、ovs-vswitchd组件是交换机的主要模块,运行在用户态,其主要负责基本的转发逻辑、地址学习、外部物理端口绑定等。还可以运用OVS自带的ovs-ofctl工具采用openflow协议对交换机进行远程配置和管理。 2、ovsdb-server组件是存储OVS的网桥等配置、日志以及…...
springboot整合vue2实现简单的新增删除,整合ECharts实现图表渲染
先看效果图: 1.后端接口 // 查询所有商品信息 // CrossOrigin(origins "*")RequestMapping("/list1")ResponseBodypublic List<Goodsinfo> list1(){List<Goodsinfo> list goodsService.list();return list;}// 删除 // …...
<蓝桥杯软件赛>零基础备赛20周--第5周--杂题-2
报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周(读者可以按…...
数据结构哈希表(散列)Hash,手写实现(图文推导)
目录 一、介绍 二、哈希数据结构 三、✍️实现哈希散列 1. 哈希碰撞💥 2. 拉链寻址⛓️ 3. 开放寻址⏩ 4. 合并散列 一、介绍 哈希表,也被称为散列表,是一种重要的数据结构。它通过将关键字映射到一个表中的位置来直接访问记录&#…...
【嵌入式设计】Main Memory:SPM 便签存储器 | 缓存锁定 | 读取 DRAM 内存 | DREM 猝发(Brust)
目录 0x00 便签存储器(Scratchpad memory) 0x01 缓存锁定(Cache lockdown) 0x02 读取 DRAM 内存 0x03 DREM Banking 0x04 DRAM 猝发(DRAM Burst) 0x00 便签存储器(Scratchpad memory&#…...
dameng数据库数据id decimal类型,精度丢失
问题处理 这一次也是精度丢失,但是问题呢还是不一样,这一次所有的id都被加一了,只有id字段被加一,还有的查询查出来封装成对象之后对象的id字段被减一了,数据库id字段使用的decimal(20,6)&…...
python图神经网络,注意力机制、Transformer模型、目标检测算法、强化学习等
近年来,伴随着以卷积神经网络(CNN)为代表的深度学习的快速发展,人工智能迈入了第三次发展浪潮,AI技术在各个领域中的应用越来越广泛 本文重点为:注意力机制、Transformer模型(BERT、GPT-1/2/3/…...
安装包 amd,amd64, arm,arm64 都有什么区别
现在的安装包也不省心,有各种版本都不知道怎么选。 根据你安装的环境配置。 amd: 32位X86 amd64: 64位X86 arm: 32位ARM arm64: 64位ARM amd64是X86架构的CPU,64位版。amd64又叫X86_64。主流的桌面PC&am…...
Ansible 企业实战详解
一、ansible简介1. ansible是什么2.ansible的特点ansible的架构图 二、ansible 任务执行1、ansible 任务执行模式2、ansible 执行流程3、ansible 命令执行过程 二 .Ansible安装部署1.yum安装2.ansible 程序结构3、ansible配置文件查找顺序4、ansible配置文件5.ansible自动化配置…...
云贝教育 |【技术文章】pg缓存插件介绍
一、pg_buffercache 主要作用是查看pg的共享池中缓存的对象信息 1.1 创建扩展 postgres# create extension pg_buffercache; CREATE EXTENSION 1.2 查看视图pg_buffercache postgres# \d pg_buffercacheView "public.pg_buffercache"Column | Type | Co…...
Kohana框架的安装及部署
Kohana框架的安装及部署 tipsKohana安装以及部署1、重要文件作用说明1.1 /index.php1.2 /application/bootstrap.php 2、项目结构3、路由配置3.1、隐藏项目入口的路由3.2、配置默认路由3.3、配置自定义的路由(Controller目录下的控制器)3.4、配置自定义的路由(Controller/direc…...
无重复字符的最长子串 Golang leecode_3
刚开始的思路,先不管效率,跑出来再说,然后再进行优化。然后就有了下面的暴力代码: func lengthOfLongestSubstring(s string) int {// count 用来记录当前最长子串长度var count int// flag 用来对下面两个 if 语句分流var flag …...
Vue项目的学习一
1、Vue项目里面的.js文件里面对象添加属性 例如:在对象:row,需要在对象row里面添加一个属性状态:type,使用里面的Vue.set函数 Vue.set(参数1,参数2,参数3) Vue.set(row,type,false)解析: 参数1࿱…...
k8s备份
cpu 磁盘io 往主的写,同步给备 rootk8s-etcd02:~# cat /etc/systemd/system/etcd.service [Unit] DescriptionEtcd Server Afternetwork.target Afternetwork-online.target Wantsnetwork-online.target Documentationhttps://github.com/coreos[Service] Typen…...
python自己造轮子使用
项目结构 首先,需要按照下列格式组织你的 package project (项目名称,随意,与package无关)|----package (这个才是包名)|----…...
Elastic stack8.10.4搭建、启用安全认证,启用https,TLS,SSL 安全配置详解
ELK大家应该很了解了,废话不多说开始部署 kafka在其中作为消息队列解耦和让logstash高可用 kafka和zk 的安装可以参考这篇文章 深入理解Kafka3.6.0的核心概念,搭建与使用-CSDN博客 第一步、官网下载安装包 需要 elasticsearch-8.10.4 logstash-8.…...
解决npm报错Error: error:0308010C:digital envelope routines::unsupported
解决npm报错Error: error:0308010C:digital envelope routines::unsupported。 解决办法;终端执行以下命令(windows): set NODE_OPTIONS--openssl-legacy-provider然后再执行 npm命令成功:...
高防IP是什么?有什么优势?
一.高防IP的概念 高防IP是指高防机房所提供的IP段,一种付费增值服务,主要是针对网络中的DDoS攻击进行保护。用户可以通过配置高防IP,把域名解析到高防IP上,引流攻击流量,确保源站的稳定可靠。 二.高防IP的原理 高防I…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
