Skip to content

Commit 43f4b22

Browse files
committed
Create merge_ranges.py
1 parent 3ac45e4 commit 43f4b22

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

merge_ranges.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
def merge_ranges(lst):
2+
""" In HiCal, a meeting is stored as tuples of integers (start_time, end_time). These integers represent the number of 30-minute blocks past 9:00am. For example:
3+
(2, 3) # meeting from 10:00 - 10:30 am
4+
(6, 9) # meeting from 12:00 - 1:30 pm
5+
Write a function merge_ranges() that takes a list of meeting time ranges and returns a list of condensed ranges.
6+
7+
>>> merge_ranges([(3, 5), (4, 8), (10, 12), (9, 10), (0, 1)])
8+
[(0, 1), (3, 8), (9, 12)]
9+
10+
>>> merge_ranges([(0, 3), (3, 5), (4, 8), (10, 12), (9, 10)])
11+
[(0, 8), (9, 12)]
12+
13+
>>> merge_ranges([(0, 3), (3, 5)])
14+
[(0, 5)]
15+
16+
>>> merge_ranges([(0, 3), (3, 5), (7, 8)])
17+
[(0, 5), (7, 8)]
18+
19+
>>> merge_ranges([(1, 5), (2, 3)])
20+
[(1, 5)]
21+
"""
22+
23+
# time: O(nlogn)
24+
# space: O(n)
25+
26+
27+
meeting_times = sorted(lst)
28+
29+
merged_range = [meeting_times[0]]
30+
31+
for start, end in meeting_times[1:]:
32+
last_start, last_end = merged_range[-1]
33+
34+
if last_end >= start:
35+
merged_range[-1] = (last_start, max(last_end, end))
36+
else:
37+
merged_range.append((start, end))
38+
39+
40+
41+
42+
43+
44+
return merged_range
45+
46+
47+
48+
49+
50+
51+
52+
53+
if __name__ == '__main__':
54+
import doctest
55+
results = doctest.testmod()
56+
if not results.failed:
57+
print 'All tests passed!'

0 commit comments

Comments
 (0)