找出两个数组的并集

题目:

问题描述

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

双指针适合处理有序数组

维护a的指针(first数组的下标)

b指针(second数组的下标)

开始遍历,如果两个元素相同,指针ab分别后移

如果不相同,当前a元素大于b元素的值,b指针向后移

否则,a指针向后移

function getInserction<T>(first: T[], second: T[]): T[] {
    let a = 0;
    let b = 0;
    const result = [];

    while (a < first.length && b < second.length) {
        const elementA = first[a];
        const elementB = second[b];
        if (elementA === elementB) {
            result.push(elementA);
            a++;
            b++;
        } else if (elementA > elementB) {
            b++;
        } else {
            a++;
        }
    }

    return result;
}



function solution(a: number[], b: number[]): number[] {
    // write code here
    // return [];

    return getInserction(a,b).reverse()
}

function main() {
    console.log(JSON.stringify(solution([1, 2, 3, 7], [2, 5, 7])) === JSON.stringify([7, 2]));
    console.log(JSON.stringify(solution([1, 4, 8, 10], [2, 4, 8, 10])) === JSON.stringify([10, 8, 4]));
    console.log(JSON.stringify(solution([3, 5, 9], [1, 4, 6])) === JSON.stringify([]));
    console.log(JSON.stringify(solution([1, 2, 3], [1, 2, 3])) === JSON.stringify([3, 2, 1]));
}