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

6 阅读2分钟

问题描述

小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. 理解交集操作:我们需要找出两个列表中共同的元素。
  2. 排序要求:找到交集后,需要将结果按从大到小的顺序排列。

数据结构选择

  • 可以使用集合(set)来快速查找交集。
  • 使用列表(list)来存储最终结果并进行排序。

算法步骤

  1. 将两个列表转换为集合。
  2. 使用集合的交集操作找到共同的元素。
  3. 将交集结果转换为列表并按从大到小的顺序排序。

代码实现

    # 将列表转换为集合
    set_a = set(a)
    set_b = set(b)
    
    # 找到两个集合的交集
    intersection = set_a & set_b
    
    # 将交集结果转换为列表并按从大到小的顺序排序
    result = sorted(intersection, reverse=True)
    
    return result

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

关键步骤解释

  • set_a = set(a) 和 set_b = set(b):将列表转换为集合,以便快速查找交集。
  • intersection = set_a & set_b:使用集合的交集操作找到共同的元素。
  • result = sorted(intersection, reverse=True):将交集结果按从大到小的顺序排序。

测试用例

在 if __name__ == '__main__': 部分,我们添加了一些测试用例来验证代码的正确性。