关于leetcode:力扣之两个数组的交集

1次阅读

共计 2025 个字符,预计需要花费 6 分钟才能阅读完成。

题目形容

给定两个数组 nums1 和 nums2,返回 它们的交加。输入后果中的每个元素肯定是 惟一 的。咱们能够 不思考输入后果的程序。

示例 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 === 2) { // 12. 如果某一项(key)呈现的次数(value)是两次,就阐明是交加的元素
            resultArr.push(key) // 13. 就把那一项给填装进后果数组中去
        }
    }
    return resultArr // 14. 最初返回后果数组
    // 留神:map 汇合可能完整保留数据格式,所以不像对象统计次数的时候,最初还须要 Number(key) 一下
};

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

正文完
 0