这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战
一、了解题目
附上原题链接:349. 两个数组的交集
给定两个数组,编写一个函数来计算它们的交集。
示例:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
对于这道题来说,有两种解法,第一种是集合,第二种是字典。那么下面我们就依据这两种方法来进行一一讲解。
二、集合解法
(1)解题思路
- 求交集且无序唯一;
- 使用集合。
(2)解题步骤
- 用集合的方法对
nums1和nums2进行去重; - 遍历
nums1,筛选出nums2中也包含的值。
(3)代码实现
依据上面的题解,我们将用 js 来实现这道题。具体实现代码如下:
/**
*
* @param {数组1} nums1
* @param {数组2} nums2
* @returns
*/
let intersection = function(nums1, nums2){
// 1.对nums1进行数组去重
const arr1 = new Set(nums1);
// 2.对nums2进行数组去重
const arr2 = new Set(nums2);
// 3.过滤掉arr1在arr2中已经有的元素,过滤结果即为交集
// has可改为includes
const arr3 = [...arr1].filter(item => arr2.has(item));
// 4.返回结果
return arr3;
}
console.log(intersection([1,2,3,4],[4,6,8])); // [ 4 ]
三、字典解法
(1)解题思路
- 求
nums1和nums2都有的值; - 用字典建立一个映射关系,记录
nums1里有的值; - 遍历
nums2,找出nums1里也有的值。
(2)解题步骤
- 新建一个字典,遍历
nums1,填充字典; - 遍历
nums2,遇到字典里的值就选出,并从字典中删除。
(3)代码实现
依据上面的题解,我们将用 js 来实现这道题。具体实现代码如下:
/**
*
* @param {数组1} nums1
* @param {数组2} nums2
* @returns
*/
let intersection = function(nums1, nums2){
// 1.先建立一个字典
const map = new Map();
// 2.遍历nums1的每一个,并放入数组中
nums1.forEach(n => {
map.set(n, true);
});
// 3.定义一个空数组,用来存放最终的交集
const res = [];
// 4.遍历nums2中的每一个
nums2.forEach(n => {
// 4.1 与nums1中的对比,如果一样则push进res
if(map.get(n)){
res.push(n);
map.delete(n);
}
});
// 5.返回最终的结果
return res;
}
console.log(intersection([1, 2, 2, 1], [2, 2])); // 1, 2
以上就是关于两个数的交集的题解,不知道对小伙伴们是否有帮助呢?
我们下期见👋👋👋