|
| 1 | +#!/bin/python |
| 2 | + |
| 3 | +""" |
| 4 | +Build a calendar. |
| 5 | +
|
| 6 | +A meeting is stored as a tuple of integers (start_time, end_time). |
| 7 | +These integers represent the number of 30-minute blocks past 9:00am. |
| 8 | +
|
| 9 | +For example: |
| 10 | +
|
| 11 | +(2, 3)# Meeting from 10:00-10:30 am |
| 12 | +(6, 9)# Meeting from 12:00-1:30 pm |
| 13 | +
|
| 14 | +Write a function merge_ranges() that takes a list of multiple meeting time ranges and returns a list of condensed ranges. |
| 15 | +
|
| 16 | +For example, given: |
| 17 | +
|
| 18 | + [(0, 1), (3, 5), (4, 8), (10, 12), (9, 10)] |
| 19 | + |
| 20 | +your function would return: |
| 21 | +
|
| 22 | + [(0, 1), (3, 8), (9, 12)] |
| 23 | + |
| 24 | +Do not assume the meetings are in order. The meeting times are coming from multiple teams. |
| 25 | +
|
| 26 | +Write a solution that's efficient even when we can't put a nice upper bound on the numbers representing our time ranges. |
| 27 | +Here we've simplified our times down to the number of 30-minute slots past 9:00 am. |
| 28 | +But we want the function to work even for very large numbers, like Unix timestamps. |
| 29 | +In any case, the spirit of the challenge is to merge meetings where start_time and end_time don't have an upper bound. |
| 30 | +""" |
| 31 | + |
| 32 | +def merge_ranges(meetings): |
| 33 | + |
| 34 | + sorted_meetings = sorted(meetings) |
| 35 | + merged_meetings = [sorted_meetings[0]] |
| 36 | + |
| 37 | + for current_meeting_start, current_meeting_ending in sorted_meetings[1:]: |
| 38 | + last_merged_meeting_start, last_merged_meeting_end = merged_meetings[-1] |
| 39 | + |
| 40 | + if (current_meeting_start <= last_merged_meeting_end): |
| 41 | + merged_meetings[-1] = (last_merged_meeting_start, max(last_merged_meeting_end, current_meeting_ending)) |
| 42 | + else: |
| 43 | + merged_meetings.append((current_meeting_start, current_meeting_ending)) |
| 44 | + |
| 45 | + return merged_meetings |
| 46 | + |
| 47 | +if __name__ == '__main__': |
| 48 | + |
| 49 | + meetings = [(0, 1), (3, 5), (4, 8), (10, 12), (9, 10)] |
| 50 | + print(merge_ranges(meetings)) |
| 51 | + print("Should return {}".format([(0, 1), (3, 8), (9, 12)])) |
0 commit comments