Python3如何查找所有参会人均可用的公共会议时间槽?
实现方案
解决思路
- 第一步:汇总所有参会人的全部会议记录,展平为单层级的会议时间列表
- 第二步:将所有会议按开始时间升序排序
- 第三步:合并重叠/时间连续的会议:如果前一个会议的结束时间 >= 后一个会议的开始时间,就将两个会议合并,结束时间取两者的最大值
- 第四步:遍历合并后的会议列表,依次计算会议前后、相邻会议之间的空隙,即为所有人都空闲的时间段
完整代码
p1_meetings = [ (855, 915), (955, 1015), (1155, 1215), ] p2_meetings = [ (815, 955), (1015, 1055), (1115, 1255), ] # 转换为整数方便计算 START_OF_DAY = 0 END_OF_DAY = 2359 meetings = [p1_meetings, p2_meetings] def get_available_time(List_of_meetings_times): # 1. 展平所有参会人的会议列表 all_meetings = [] for person_meetings in List_of_meetings_times: all_meetings.extend(person_meetings) # 无会议的特殊情况:全天空闲 if not all_meetings: print(f"00 {END_OF_DAY}") return # 2. 按会议开始时间排序 all_meetings.sort(key=lambda x: x[0]) # 3. 合并重叠/相邻会议 merged = [all_meetings[0]] for curr_start, curr_end in all_meetings[1:]: last_start, last_end = merged[-1] # 当前会议和上一个合并后的会议重叠/相邻,合并 if curr_start <= last_end: new_end = max(last_end, curr_end) merged[-1] = (last_start, new_end) else: merged.append((curr_start, curr_end)) # 4. 计算空闲时间段 available_slots = [] # 当日开始到第一个会议的空闲 if merged[0][0] > START_OF_DAY: available_slots.append((START_OF_DAY, merged[0][0])) # 相邻会议之间的空闲 for i in range(1, len(merged)): prev_end = merged[i-1][1] curr_start = merged[i][0] if prev_end < curr_start: available_slots.append((prev_end, curr_start)) # 最后一个会议到当日结束的空闲 if merged[-1][1] < END_OF_DAY: available_slots.append((merged[-1][1], END_OF_DAY)) # 按要求格式输出 for s, e in available_slots: if s == START_OF_DAY: print(f"00 {e}") else: print(f"{s} {e}") get_available_time(meetings)
运行输出
00 815 1055 1115 1255 2359
内容的提问来源于stack exchange,提问作者Leearn2303
相关产品推荐
相关产品推荐

