📜  给定n个约会,查找所有有冲突的约会(1)

📅  最后修改于: 2023-12-03 15:11:39.191000             🧑  作者: Mango

给定n个约会,查找所有有冲突的约会

在一定时间范围内,可能出现多个约会时间会重复的情况,此时需要查找所有有冲突的约会。这就需要编写一个程序来解决这个问题。

题目分析
  1. 输入: n个约会的开始时间和结束时间。

  2. 输出: 所有有冲突的约会。

  3. 实现思路: 首先,将所有的约会按照开始时间排序,然后依次遍历每个约会,判断当前约会的结束时间是否小于下一个约会的开始时间,如果小于,则说明没有冲突,将此约会加入结果集中;否则,说明有冲突,将此约会和下一个约会加入结果集中。

代码实现
def find_conflicts(schedule):
    """
    schedule: list of tuples, each tuple contains start and end time of a schedule

    return: list of tuples, each tuple represents a conflict schedule
    """
    if len(schedule) <= 1:
        return []

    schedule = sorted(schedule, key=lambda x: x[0])
    conflicts = []
    for i in range(len(schedule) - 1):
        if schedule[i][1] > schedule[i+1][0]:
            conflicts.append((schedule[i], schedule[i+1]))

    return conflicts
测试
schedules = [
    (datetime.datetime(2021, 5, 1, 8, 0), datetime.datetime(2021, 5, 1, 9, 0)),
    (datetime.datetime(2021, 5, 1, 9, 0), datetime.datetime(2021, 5, 1, 10, 0)),
    (datetime.datetime(2021, 5, 1, 8, 30), datetime.datetime(2021, 5, 1, 10, 30)),
    (datetime.datetime(2021, 5, 1, 11, 0), datetime.datetime(2021, 5, 1, 12, 0)),
    (datetime.datetime(2021, 5, 1, 13, 0), datetime.datetime(2021, 5, 1, 14, 0))
]
print(find_conflicts(schedules))

输出:

[((datetime.datetime(2021, 5, 1, 8, 0), datetime.datetime(2021, 5, 1, 9, 0)),
  (datetime.datetime(2021, 5, 1, 8, 30), datetime.datetime(2021, 5, 1, 10, 30))),
 ((datetime.datetime(2021, 5, 1, 8, 30), datetime.datetime(2021, 5, 1, 10, 30)),
  (datetime.datetime(2021, 5, 1, 9, 0), datetime.datetime(2021, 5, 1, 10, 0)))]