小S的倒排索引 | 豆包MarsCode AI刷题

100 阅读2分钟

小S的倒排索引

问题描述

小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]

解题思路

找出两个有序数组 a 和 b 的交集,然后按照从小到大排序即可。这里我采用双指针方法,

  1. 初始化

    • 定义一个空列表result用于存储交集结果。
    • 初始化指针ij为0,用于遍历列表ab
  2. 双指针遍历

    • 使用while i < len(a) and j < len(b):进行遍历,当a[i]b[j]相等时,将a[i]添加到result并同时移动两个指针。
    • 如果a[i] < b[j],则移动指针i;否则,移动指针j
  3. 反转结果

    • 使用result.reverse()反转result列表。
  4. 返回结果

    • 返回反转后的result列表。

完整代码

def solution(a, b):
    result = []
    i, j = 0, 0

    # 双指针遍历
    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

    # 反转结果列表
    result.reverse()
    
    return result

运行结果

image.png 如有疏漏,请多多海涵!