【发布时间】:2020-04-04 18:33:18
【问题描述】:
我的一个朋友把他最近收到的一个面试问题递给了我,我对我解决问题的方法不太满意。问题如下:
- 您有两个列表。
- 每个列表将包含长度为 2 的列表,它们表示一个范围(即 [3,5] 表示从 3 到 5 的范围,包括端点)。
- 您需要返回集合之间所有范围的交集。如果我给你 [1,5] 和 [0,2],结果将是 [1,2]。
- 在每个列表中,范围将始终增加并且永远不会重叠(即它将是 [[0, 2], [5, 10] ... ] 永远不会 [[0,2], [2,5] 。 .. ])
一般而言,在列表的排序或重叠方面没有“陷阱”。
例子:
a = [[0, 2], [5, 10], [13, 23], [24, 25]]
b = [[1, 5], [8, 12], [15, 18], [20, 24]]
预期输出:
[[1, 2], [5, 5], [8, 10], [15, 18], [20, 24]]
我的惰性解决方案是将范围列表展开为整数列表,然后进行集合交集,如下所示:
def get_intersection(x, y):
x_spread = [item for sublist in [list(range(l[0],l[1]+1)) for l in x] for item in sublist]
y_spread = [item for sublist in [list(range(l[0],l[1]+1)) for l in y] for item in sublist]
flat_intersect_list = list(set(x_spread).intersection(y_spread))
...
但我想有一个既可读又更高效的解决方案。
如果您不介意,请说明您将如何在精神上解决这个问题。时间/空间复杂度分析也会有所帮助。
谢谢
【问题讨论】:
-
[1, 2]是[0, 2]和[1, 5]的联合体吗? -
你“懒惰”的解决方案甚至没有给出预期的输出。
-
@DimKoim 是的,我只是想看看我要去哪里
-
@EliSadoff 对不起,十字路口。谢谢
-
@EliSadoff 作为一个范围,
0-2和1-5的交集是1-2