力扣之兩個陣列的交集

水冗水孚發表於2022-07-13

題目描述

給定兩個陣列 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)一下
};
好記性不如爛筆頭,記錄一下吧^_^

相關文章