模拟消息队列

567 篇文章

已下架不支持订阅

473 篇文章

已下架不支持订阅

题目解析

本题应该就是逻辑分析题。

具体解析请看代码注释,已为代码添加详细注释。

JS算法源码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  const pubs = parse(await readline());
  const subs = parse(await readline());

  // 按照发布时间升序
  pubs.sort((a, b) => a[0] - b[0]);

  // 记录每个订阅者收到的内容
  const contents = [];
  for (let i = 0; i < subs.length; i++) contents.push([]);

  // 遍历发布消息
  for (let [pubTime, pubContent] of pubs) {
    // 发布的消息会被发送到订阅的消费者中优先级最高
    // 输入中订阅者按优先级升序排列, 因此后面的订阅者优先级更高, 因此这里倒序
    for (let j = subs.length - 1; j >= 0; j--) {
      const [start, end] = subs[j

已下架不支持订阅

### 如何用Python实现模拟消息队列Python中,可以通过多种方式实现消息队列的功能。以下是基于引用中的内容以及标准实践的一种具体实现方案。 #### 使用列表模拟基本的消息队列行为 通过`list`数据结构可以简单地实现入队和出队的操作。然而,在处理大规模数据时,由于`pop(0)`的时间复杂度较高,建议改用`collections.deque`来提升效率[^1]。 ```python from collections import deque class SimpleQueue: def __init__(self): self.queue = deque() def enqueue(self, item): """向队列添加元素""" self.queue.append(item) def dequeue(self): """从队列移除并返回第一个元素""" if not self.is_empty(): return self.queue.popleft() return None def is_empty(self): """判断队列是否为空""" return len(self.queue) == 0 def size(self): """获取队列的大小""" return len(self.queue) ``` #### 华为OD机试中的高级消息队列模拟 针对更复杂的场景,例如带有时间戳的消息发布与订阅机制,可以参考华为OD机试题目的解决方案。该题目要求设计一个支持按时间段订阅/取消订阅的消息分发系统,并依据优先级将消息传递给合适的消费者[^2]。 下面展示了一个简化版的实现: ```python def process_messages(broadcast_data, listener_data): """ 处理广播消息并将它们分配到对应的监听器。 参数: - broadcast_data: 广播消息的数据 (每两个连续整数表示一条消息及其发布时间) - listener_data: 监听器的数据 (每两个连续整数表示监听起始时间和结束时间) """ total_broadcasts = len(broadcast_data) // 2 total_listeners = len(listener_data) // 2 # 将广播数据转换成元组形式 [(time, message), ...] broadcasts = [ (broadcast_data[i * 2], broadcast_data[i * 2 + 1]) for i in range(total_broadcasts) ] # 将监听器数据转换成元组形式 [(start_time, end_time), ...] listeners = [ (listener_data[i * 2], listener_data[i * 2 + 1]) for i in range(total_listeners) ] # 对广播消息按照时间排序 broadcasts.sort(key=lambda x: x[0]) # 初始化每个监听器接收到的消息列表 listener_messages = [[] for _ in range(total_listeners)] # 遍历所有广播消息 for time, message in broadcasts: # 倒序遍历监听器以满足高优先级需求 for i in reversed(range(total_listeners)): start_listen, end_listen = listeners[i] # 如果当前广播时间落在某个监听器的有效区间内,则将其加入对应的消息列表 if start_listen <= time < end_listen: listener_messages[i].append(message) break # 只需找到最近的一个匹配即可 # 输出结果 for messages in listener_messages: print(' '.join(map(str, messages)) if messages else "-1") if __name__ == '__main__': # 示例输入 broadcast_data = [1, 'A', 2, 'B', 3, 'C'] listener_data = [1, 4, 2, 5] process_messages(broadcast_data, listener_data) ``` 以上代码实现了消息队列的核心逻辑,即根据广播时间和监听范围动态调整消息接收情况[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿甘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值