1. 程式人生 > >js 取兩數字陣列交集

js 取兩數字陣列交集

今天刷LeetCode發現了陣列交集的問題,平時工作也都用的非常普遍。所以特別留意了,兩個數字陣列的交集,有兩題

1.交集陣列不包含重複數字

2.交集陣列包含重複數字

第一題:先給兩個陣列分別去重,然後再雙迴圈遍歷比較,自己想的比較low,參考discuss大神寫的https://leetcode.com/submissions/detail/193703614/

大概就是先遍歷其中一個數組,遍歷到每個元素當做屬性存入物件,繼續遍歷第二個陣列對比這個物件的屬性,存在即存入結果返回

程式碼如下:

var intersection = function(nums1, nums2) {
    const nums1Hash 
= {} const resultArr = [] nums1.forEach(i => nums1Hash[i] = true) nums2.forEach(i => { if (nums1Hash[i] === true) { resultArr.push(i) nums1Hash[i] = false } }) return resultArr };

 

第二題:我使用的方法和第一題一樣,只不過物件的值不是bool值,而是通過物件值計數。這樣就不會遺漏重複的數字了,沒想到一瞧discuss,總有大神。

https://leetcode.com/submissions/detail/193705336/

程式碼如下:

使用陣列的reduce,不斷歸併陣列,達到遍歷比較的目的

var intersect = function(nums1, nums2) {
    if(nums1.length > nums2.length){
        //swap values
        [nums1, nums2] = [nums2, nums1];
    }
    
    const map = nums1.reduce((map, val) => {
        map[val] 
= (map[val] || 0) + 1; return map; }, {}); // console.log(map); return nums2.reduce((res, val) => { if(map[val] && map[val] > 0){ res.push(val); map[val]--; } return res; }, []); };