【模拟消息队列】Python 实现

360影视 日韩动漫 2025-05-06 13:54 2

摘要:def simulate_message_queue:import sysfrom collections import defaultdict# 读取两行输入line1 = sys.stdin.readlineline2 = sys.stdin.readli

def simulate_message_queue:import sysfrom collections import defaultdict# 读取两行输入line1 = sys.stdin.readlineline2 = sys.stdin.readline# 解析消息message_data = list(map(int, line1.strip.split))messages = for i in range(0, len(message_data), 2):time = message_data[i]content = message_data[i + 1]messages.append((time, content))messages.sort # 按时间排序# 解析消费者consumer_data = list(map(int, line2.strip.split))M = len(consumer_data) // 2consumers = for i in range(0, len(consumer_data), 2):sub_time = consumer_data[i]unsub_time = consumer_data[i + 1]consumers.append((sub_time, unsub_time))# 初始化active_consumers = # 按优先级升序排列,最后一个优先级最高received_messages = [ for _ in range(M)]# 生成所有事件并按时间处理events = defaultdict(list)for idx, (sub_time, unsub_time) in enumerate(consumers):events[sub_time].append(('sub', idx))events[unsub_time].append(('unsub', idx))for time, content in messages:events[time].append(('msg', content))# 按时间顺序处理事件for time in sorted(events.keys):# 同一时间的事件顺序:sub > unsub > msgcurrent_events = events[time]# 先处理订阅for event in current_events:if event[0] == 'sub':_, idx = eventactive_consumers.append(idx)# 再处理取消订阅for event in current_events:if event[0] == 'unsub':_, idx = eventif idx in active_consumers:active_consumers.remove(idx)# 最后处理消息for event in current_events:if event[0] == 'msg':_, content = eventif active_consumers:# 发送给优先级最高的消费者(最后一个)highest_priority = active_consumers[-1]received_messages[highest_priority].append(content)# 输出for msgs in received_messages:if msgs:print(' '.join(map(str, msgs)))else:print(-1)simulate_message_queue

来源:小轩科技每日一讲

相关推荐