Нам нужно только выполнить итерацию в диапазоне кортежей sorted , найти недостающие элементы между позицией i
в списке и позицией i+1
.
Первый ипоследние кортежи являются крайними случаями и должны рассматриваться отдельно, а также пустым входным регистром.Вот возможный алгоритм:
def find_missing_ranges(tuples, start=0, end=48):
# edge case: empty input
if not tuples:
return [(start, end)]
ans = []
# sort the input
lst = sorted(tuples)
# edge case: handle start of range
if lst[0][0] != 0:
ans.append((start, lst[0][0]))
for i in range(len(lst) - 1):
# normal case, find holes between tuples i and i+1
if lst[i][1] != lst[i + 1][0]:
ans.append((lst[i][1], lst[i + 1][0]))
# edge case: handle end of range
if lst[-1][1] != end:
ans.append((lst[-1][1], end))
return ans
Он работает, как и ожидалось, с примером ввода:
find_missing_ranges([])
=> [(0, 48)]
find_missing_ranges([(0, 48)])
=> []
find_missing_ranges([(10, 12), (12, 37)])
=> [(0, 10), (37, 48)]
find_missing_ranges([(9, 15)])
=> [(0, 9), (15, 48)]
find_missing_ranges([(0, 15), (15, 17), (17, 19), (21, 25)])
=> [(19, 21), (25, 48)]
find_missing_ranges([(23, 35), (40, 47)])
=> [(0, 23), (35, 40), (47, 48)]