它应该是一个简化信息输出的功能。
例如,输入是一个元组列表[(2, 7), (7, 8)]
,那么输出应该是[(2, 8)]
我已经尝试解决此任务,但是有一个错误,或者我解决这个问题的方法不正确
def func(array):
temparray = []
for i in range(len(array) - 1):
if math.fabs(array[i + 1][0] - array[i][1]) == 0 or math.fabs(array[i + 1][0] - array[i][1]) == 1:
if array[i + 1][1] > array[i][1]:
temparray.append(tuple([array[i][0], array[i + 1][1]]))
else:
temparray.append(tuple([array[i][0], array[i][1]]))
else:
temparray.append(tuple([array[i][0], array[i][1]]))
return temparray
我希望[(3, 5), (4, 8), (10, 12), (9, 10)]
的输出为[(3, 8), (9, 12)]
,但实际输出为[(3, 8), (4, 8), (10, 12)]
。
这是解决方法:
def func(intervals):
si = sorted(intervals, key=lambda tup: tup[0])
merged = []
for tup in si:
if not merged:
merged.append(tup)
else:
b = merged.pop()
if b[1] >= tup[0]:
new_tup = (b[0], max(b[1], tup[1]))
merged.append(new_tup)
else:
merged.append(b)
merged.append(tup)
return merged
有关更多详细信息-> https://codereview.stackexchange.com/questions/69242/merging-overlapping-intervals
答案 0 :(得分:0)
如果使用临时数组,则无法尽可能减少。
def func(array):
l=len(array)
for i in range(1,l):
check=False
check=array[i-1] and abs(array[i][0] - array[i-1][1]) <=1
if not check and array[i-1] and abs(array[i][1] - array[i-1][0]) <=1:
array[i-1],array[i]=array[i],array[i-1]
check=True
if check:
if array[i][1] > array[i-1][1]:
array[i]=(array[i-1][0], array[i][1])
else:
array[i]=array[i-1]
array[i-1]=None
return [i for i in array if i]
assert func([(3, 5), (4, 8), (10, 12),(9, 10),]) == [(3, 8), (9, 12)]
assert func([(1,2), (3,2), (3,4)]) == [(1,4)]
assert func([(1,2), (1,2)]) == [(1,2)]
assert func([(1,2), (2,3), (2,4)]) == [(1,4)]