题目描述
小S正在帮助她的朋友们建立一个搜索引擎。为了让用户能够更快地找到他们感兴趣的帖子,小S决定使用倒排索引。倒排索引的工作原理是:每个单词都会关联一个帖子ID的列表,这些帖子包含该单词,且ID按从小到大的顺序排列。
例如,单词“夏天”可能出现在帖子1、帖子3和帖子7中,那么这个单词的倒排链就是 [1, 3, 7]。如果用户想同时找到包含“夏天”和“海滩”的帖子,小S需要找出两个倒排链的交集,且将结果按照从大到小的顺序输出。现在,给定两个单词的倒排链数组 a 和 b,请你帮助小S找出同时包含这两个单词的帖子ID,并按从大到小的顺序返回结果。
测试样例
样例1:
输入:
a = [1, 2, 3, 7], b = [2, 5, 7]
输出:[7, 2]
样例2:
输入:
a = [1, 4, 8, 10], b = [2, 4, 8, 10]
输出:[10, 8, 4]
样例3:
输入:
a = [3, 5, 9], b = [1, 4, 6]
输出:[]
样例4:
输入:
a = [1, 2, 3], b = [1, 2, 3]
输出:[3, 2, 1]
题目解析
今天还是一道比较简单的题,这道题虽然说了很多,但最后所要实现的要求比较简单,有两个关键点:
1.返回两个倒排链的交集,即同时出现在两个列表中的帖子 ID。
2.结果需按从大到小的顺序排列。
所以我们最后的算法是要针对这两个点去实现,先说第一个,要找到它们两个交集的情况,我们还需要考虑一下边界情况,也就是说如果 a 和 b 没有交集的时候,我们要返回的应该是一个空列表,所以在做第一步的时候,首先我们要定义一个空列表,来接受交集值或者直接返回这个列表,在python中,我们可以选择先遍历一个列表a或 b(我选择的是b),然后在循环里判断b里面的值在不在a,如果在,我们就可以将这个值加入到这个定义的列表里面去,如果不在,最后返回的就是空列表,然后是第二点中的排序,我们可以用python中的sort函数进行排序,将sort里面的reverse设置为True就可以实现从大到小的排序,这个功能是真舒服,省去了很多不必要的代码,当然,我当时写的时候也没注意到也可以用列表的切片进行反转操作,因为我发现给的样例都是按升序排的,那么我们加入到列表的元素也是升序,那么就可以直接使用列表的反转即可,但考虑到和我一样才学没多久的一些同学,我这个似乎读起来更好理解,那么就上代码
def solution(a, b):
# write code here
num=[]
for i in b:
if i in a:
num.append(i)
num.sort(reverse=True)
return num
if __name__ == '__main__':
print(solution([1, 2, 3, 7], [2, 5, 7]) == [7, 2])
print(solution([1, 4, 8, 10], [2, 4, 8, 10]) == [10, 8, 4])
print(solution([3, 5, 9], [1, 4, 6]) == [])
print(solution([1, 2, 3], [1, 2, 3]) == [3, 2, 1])
这个代码就很通俗易懂啦,当然还有更高阶的算法,就是双指针(原理是:因为给的列表排序好了,那么我就可以一个一个比较,相同的就加入定义的列表,不同的,谁更小,那么指针就往后移),我也奉上这个代码:
def solution(a, b):
i, j = 0, 0
result = []
while i < len(a) and j < len(b):
if a[i] == b[j]:
result.append(a[i])
i += 1
j += 1
elif a[i] < b[j]:
i += 1
else:
j += 1
return result[::-1]
那么今天的文章也就到这了,各位同学一起加油!!!