【华为机试】2023年真题B卷(python)-模拟消息队列
一、题目
题目描述:
让我们来模拟一个消息队列的运作,有一个发布者和若干消费者,发布者会在给定的时刻向消息队列发送消息若此时消息队列有消费者订阅,这个消息会被发送到订阅的消费者中优先级最高(输入中消费者按优先级升序排列)的一个。
若此时没有订阅的消费者,该消息被消息队列丢弃。消费者则会在给定的时刻订阅消息队列或取消订阅。当消息发送和订阅发生在同一时刻时,先处理订阅操作,即同一时刻订阅的消费者成为消息发送的候选。.当消息发送和取消订阅发生在同一时刻时,先处理取消订阅操作,即消息不会被发送到同一时刻取消订阅的消费者
二、输入输出
输入描述:
输入为两行。 第一行为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时刻到达,此时两人消费者都订阅了,消息发送给优先级最高的第二个消费者: 消息33在时刻3到达,此时只有第一个消费者订阅,消息发送给它; 余下的消息按规则也是发送给第一个消费者
示例2:
输入:
5 64 11 64 9 97
9 11 4 9
输出:
97
64
说明:消息64在5时刻到达,此时只有第二个消费者订阅,消息发送给它 消息97在9时刻到达,此时只有第一消费者订阅(因为第二个消费者刚好在9时刻取消订阅),消息发送给它.11时刻也到达了一个内容为64的消息,不过因为没有消费者订阅,消息被丢弃
四、要求
时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++262144K,其他语言524288K
五、解题思路
- 将发布信息和消费信息解析为
Message
对象,并存储在producer_map
和consumer_map
列表中。- 根据发布信息的属性对
producer_map
进行排序。- 创建一个二维列表
relation_map
,用于存储消费关系。- 遍历发布信息和消费信息,根据条件构造消费关系,并将结果存储在
relation_map
中。- 遍历
relation_map
,输出消费关系。如果某个消费者没有关联的发布信息,则输出-1。
六、参考代码?
# -*- coding: utf-8 -*-
'''
@File : 2023-B-模拟消息队列.py
@Time : 2024/01/05 14:45:58
@Author : mgc
@Version : 1.0
@Desc : None
'''
class Message:
def __init__(self, a, b):
self.a = a
self.b = b
def optimize_message_relationship():
# 解析输入的发布信息和消费信息
nums = [int(x) for x in input().split(" ")]
nums1 = [int(x) for x in input().split(" ")]
n = len(nums)
m = len(nums1)
# 发布信息
producer_map = []
i = 0
while i < n:
ss = Message(nums[i], nums[i + 1])
producer_map.append(ss)
i += 2
producer_map = sorted(producer_map, key=lambda x: x.a, reverse=False)
# 消费信息
consumer_map = []
j = 0
while j < m:
ss1 = Message(nums1[j], nums1[j + 1])
consumer_map.append(ss1)
j += 2
# 构造消费关系
relation_map = [[] for x in range(int(m / 2))]
for i in range(int(n / 2)):
j = int(m / 2) - 1
while j >= 0:
if producer_map[i].a >= consumer_map[j].a:
if producer_map[i].a < consumer_map[j].b:
relation_map[j].append(producer_map[i].b)
break
j -= 1
# 输出消费关系
for i in range(int(m / 2)):
if len(relation_map[i]) == 0:
print("-1")
else:
result = ""
for x in relation_map[i]:
result += str(x) + " "
print(result)
# 调用优化后的方法
optimize_message_relationship()
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!