青训5_1112_01 小S的倒排索引(内置方法 set(a)& set(b) 及sorted 排序)

青训5_1112_01 小S的倒排索引.md

问题描述

小S正在帮助她的朋友们建立一个搜索引擎。为了让用户能够更快地找到他们感兴趣的帖子,小S決定使用倒排索引。倒排索引的工作原理是:每个单词都会关联一个帖子ID的列表,这些帖子包含该单词,且ID按从小到大的顺序排列。例如,单词“夏天“可能出现在帖子1、帖子3和帖子7中,那么这个单词的倒排链就是[1,3,7]。如果用户想同时找到包含"夏天”和”海滩"的帖子,小S需要找出两个倒排链的交集,且将结果按照从大到小的顺序输出。现在,给定两个单词的倒排链数组a和b,请你帮助小S找出同时包含这两个单词的帖子ID,并按从大到小的顺序返回结果。

测试样例

样例7:
输入: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]

示例

def solution(a, b):
    # write code here
    return []

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

思路

找到两个数据中的相同数字、同时从大到小排序为数组

答案1 内置方法 set(a)& set(b) 及sorted 排序

def solution(a, b):
    # 将两个列表转换为集合并求交集
    common = set(a) & set(b)
    # 将交集转换为列表并降序排序
    return sorted(list(common), reverse=True)

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

方法2 不用内置方法,首席排序和共同数字集合

def solution(a, b):
    # 用于存储结果的列表
    result = []
    
    # 获取数组长度
    len_a = len(a)
    len_b = len(b)
    
    # 初始化两个指针,分别指向a和b的起始位置
    i = 0
    j = 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]:  # a中的元素较小,移动a的指针
            i += 1
        else:  # b中的元素较小,移动b的指针
            j += 1
    
    # 将结果反转,实现从大到小排序
    left = 0
    right = len(result) - 1
    while left < right:
        result[left], result[right] = result[right], result[left]
        left += 1
        right -= 1
        
    return result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值