力扣之两个数组的交集

题目描述 【力扣之两个数组的交集】给定两个数组 nums1nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]

示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的

力扣原题目地址:https://leetcode.cn/problems/...
思路分析 方案一 循环一个数组得到每一项值,判断另一个数组中有没有这个值
var intersection = function (nums11, nums22) { let nums1 = [...new Set(nums11)] // 1. 两个数组分别去重 let nums2 = [...new Set(nums22)] // 2. 不去重就重复比较判断了,会浪费性能 let arr = [] // 3. 定义一个数组用来存储两个数组的交集 for (let i = 0; i < nums1.length; i++) { if (nums2.indexOf(nums1[i]) > -1) { // 4. 看看一个数组中的一项一项的值,在另一个数组中有没有,当然这里也可以使用includes方法 arr.push(nums1[i]) // 5. 有的话,就说明是两个数组共有的项,即为 交集 } } return arr // 6. 最后返回即可 };

方案二 两个数组去重以后再合并,然后统计,每一项出现的次数,出现次数为两次的即为交集
使用对象统计次数写法:
var intersection = function (nums1, nums2) { // 1. 先把两个数组去重,然后再合并在一块成为一个新数组 let newArr = [...Array.from(new Set(nums1)), ...Array.from(new Set(nums2))] // 这样写也可以的 [...new Set(nums1), ...new Set(nums2)] let obj = {} // 2. 定义一个对象用来存储每一项出现的次数 for (let i = 0; i < newArr.length; i++) { // 3. 一开始的一项在对象中肯定是没有的 if (newArr[i] in obj) { // 5. 后来的话,可能就有了,就把次数再原来的基础上加一 obj[newArr[i]] = obj[newArr[i]] + 1 } else { obj[newArr[i]] = 1 // 4. 没有的话,就把这一项作为对象的key,并给其value赋初始值1,表示出现了一次 } } let resultArr = [] // 6. 定义一个结果数组,用来收集最终交集的结果 console.log(111, obj); for (const key in obj) { // 7. 遍历这个对象 if (obj[key] === 2) { // 8. 因为去重了,所以出现的次数要么一次,要么两次,所以看看谁是两次 resultArr.push(Number(key)) // 9. 对象的key字符串数字类型了,所以要转一下成原来的数字类型 } } return resultArr // 10. 返回结果即可 };

使用Map集合统计次数写法
var intersection = function (nums1, nums2) { let newArr = [...new Set(nums1), ...new Set(nums2)] // 1. 分别去重再合并成一个新数组 let map = new Map() // 2. 创建一个map集合用来记录出现的次数 for (let i = 0; i < newArr.length; i++) { // 3. 循环新数组去统计次数 // 4. 一开始是map集合中是不存在这一项的 if (map.has(newArr[i])) { // 6. 后来就有了某一项,就有了重复的时候 let count = map.get(newArr[i]) // 7. 有了重复的时候,就获取这一项出现的次数取出来 count = count + 1 // 8. 因为又出现了一次,所以就在原有的次数上加一次 map.set(newArr[i], count) // 9. 然后重新更新其出现的次数 } else { map.set(newArr[i], 1) // 5. 一开始map集合中不存在某一项,那么就先统计其出现的次数为1次 } } let resultArr = [] // 10. 定义一个结果数组用来存储交集结果 for (const [key, value] of map) { // 11. 遍历这个map集合,这里使用for of遍历,当然也可以使用forEach遍历 if (value =https://www.it610.com/article/== 2) { // 12. 如果某一项(key)出现的次数(value)是两次,就说明是交集的元素 resultArr.push(key) // 13. 就把那一项给填装进结果数组中去 } } return resultArr // 14. 最后返回结果数组 // 注意:map集合能够完好保存数据格式,所以不像对象统计次数的时候,最后还需要Number(key)一下 };

好记性不如烂笔头,记录一下吧^_^

    推荐阅读