“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作为二维数组,tmp1和tmp2分别作为res[0]和res[1]。 - 将
nums1和nums2数组去重,分别赋值给_nums1和_nums2。 - 遍历
_nums1,查看当前元素是否有出现在_nums2中,如果有则继续遍历,如果没有则将其存进tmp1数组。 - 遍历
_nums2,查看当前元素是否有出现在_nums1中,如果有则继续遍历,如果没有则将其存进tmp2数组。 - 都遍历完成之后,将
tmp1和tmp2压进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}
};