Topic description

Given two arrays nums1 and nums2 , return the intersection of them. Each element in the output must be unique. We can ignore the order of output results.

Example 1:

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

Example 2:

 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的
Likou original title address: https://leetcode.cn/problems/intersection-of-two-arrays

Thought analysis

Scheme 1 loops through an array to get each value, and determines whether there is this value in another array

 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. 最后返回即可
};

Scheme 2 The two arrays are combined after deduplication, and then counted. The number of occurrences of each item is the intersection if the number of occurrences is twice.

Use the object count method to write:

 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. 返回结果即可
};

Use the Map collection to count the number of times

 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 === 2) { // 12. 如果某一项(key)出现的次数(value)是两次,就说明是交集的元素
            resultArr.push(key) // 13. 就把那一项给填装进结果数组中去
        }
    }
    return resultArr // 14. 最后返回结果数组
    // 注意:map集合能够完好保存数据格式,所以不像对象统计次数的时候,最后还需要Number(key)一下
};
Good memory is not as good as bad writing, record it ^_^

水冗水孚
1.1k 声望588 粉丝

每一个不曾起舞的日子,都是对生命的辜负