【2022 力扣春招季--刷题 PK】5268. 找出两数组的不同(简单)

109 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

一、题目描述

给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中:

  • answer[0] 是 nums1 中所有 存在于 nums2 中的 不同 整数组成的列表。
  • answer[1] 是 nums2 中所有 存在于 nums1 中的 不同 整数组成的列表。

注意: 列表中的整数可以按 任意 顺序返回。

 

示例 1:

输入: nums1 = [1,2,3], nums2 = [2,4,6]
输出: [[1,3],[4,6]]
解释: 对于 nums1 ,nums1[1] = 2 出现在 nums2 中下标 0 处,然而 nums1[0] = 1 和 nums1[2] = 3 没有出现在 nums2 中。因此,answer[0] = [1,3]。
对于 nums2 ,nums2[0] = 2 出现在 nums1 中下标 1 处,然而 nums2[1] = 4 和 nums2[2] = 6 没有出现在 nums2 中。因此,answer[1] = [4,6]

示例 2:

输入: nums1 = [1,2,3,3], nums2 = [1,1,2,2]
输出: [[3],[]]
解释: 对于 nums1 ,nums1[2] 和 nums1[3] 没有出现在 nums2 中。由于 nums1[2] == nums1[3] ,二者的值只需要在 answer[0] 中出现一次,故 answer[0] = [3]。
nums2 中的每个整数都在 nums1 中出现,因此,answer[1] = []

 

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • -1000 <= nums1[i], nums2[i] <= 1000

二、思路分析

题目要求返回一个长度为 2 的二维数组(设为 res),第一个元素是 nums1 中所有 存在于 nums2 中的 不同 整数组成的数组,第二个元素是 nums2 中所有 存在于 nums1 中的 不同 整数组成的数组。

有两个要求:① res[0] 中的每个元素必定与 res[1] 中的每个元素都不相同;② res[0]res[1]中的元素要去重。

我们很快就有了思路:

  • 定义 res 作为二维数组,tmp1tmp2 分别作为 res[0]res[1]
  • nums1nums2 数组去重,分别赋值给 _nums1_nums2
  • 遍历 _nums1 ,查看当前元素是否有出现在 _nums2 中,如果有则继续遍历,如果没有则将其存进 tmp1 数组。
  • 遍历 _nums2 ,查看当前元素是否有出现在 _nums1 中,如果有则继续遍历,如果没有则将其存进 tmp2 数组。
  • 都遍历完成之后,将 tmp1tmp2 压进 res 中即可。

三、AC 代码

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[][]}
 */
var findDifference = function(nums1, nums2) {
    let res = [];
    let tmp1 = [], tmp2 = [];
    let _nums1 = new Set(nums1), _nums2 = new Set(nums2);
    for (let x of _nums1) {
        if (!_nums2.has(x)) {
            tmp1.push(x);
        }
    }
    for (let x of _nums2) {
        if (!_nums1.has(x)) {
            tmp2.push(x);
        }
    }
    res.push(tmp1);
    res.push(tmp2);
    return res;
    // 也可以直接 return {tmp1, tmp2}
};