1:添加范围-跟踪提供的输入范围。添加与当前跟踪范围部分重叠的范围应跟踪添加范围中尚未跟踪的任何数字
e.g. AddRange(10,180)- start tracking range 10-180
AddRange(150,200)- start tracking range 150-200
AddRange(250,500) - start tracking range 250-500
可能的解决方案
def merge_ranges(ranges):
ranges = iter(sorted(ranges))
current_start, current_stop = next(ranges)
for start, stop in ranges:
if start > current_stop:
# Gap between segments: output current segment and start a new one.
yield current_start, current_stop
current_start, current_stop = start, stop
else:
# Segments adjacent or overlapping: merge.
current_stop = max(current_stop, stop)
yield current_start, current_stop
2:删除范围:从被钉的数字中删除提供的数字范围。对于部分跟踪范围的删除范围操作应删除该范围中已跟踪的所有数字
e.g. Ranges tracked [10-200],[250-500]
RemoveRange(50,150) - stop tracking range 50-150 ([10-149], [151-200],[250-500])
RemoveRange(400,600) - stop tracking range 400-500 ([10-49],[250-399])
Remove range(600,800) - no-op as none of the ranges were tracked
可能的解决方案
def remove_overlap(rs):
rs.sort()
def process (rs,deviation):
start = len(rs) - deviation - 1
if start < 1:
return rs
if rs[start][0] > rs[start-1][1]:
return process(rs,deviation+1)
else:
rs[start-1] = ((rs[start][0],rs[start-1][0])[rs[start-1][0] < rs[start][0]],(rs[start][1],rs[start-1][1])[rs[start-1][1] > rs[start][1]])
del rs[start]
return process(rs,0)
return process(rs,0)
3查询范围:如果整个范围都在跟踪,则返回true;否则为假
e.g QueryRange(50,100) - returns True
QueryRange(180,300) - returns False (only part of the range is being tracked)
QueryRange (600,100)- returns False(not tracked at all)
如何实现这个?
此外,还需要以面向对象的方式实现整个过程:
伪代码:
class RangeModule:
def AddRange(self, lower, upper):
pass
def QueryRange(self, lower, upper):
return True
def RemoveRange(self, lower, upper):
pass
保持按起点排序的成对(范围)列表。您有责任确保范围不重叠,并且它们彼此不相邻-如果相邻,则合并它们
因为它们是排序的,并且不重叠,所以可以快速找到与输入范围重叠的部分。使用此选项可以处理添加、查询和删除
相关问题 更多 >
编程相关推荐