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;
    }, []);
};

猜你喜欢

转载自www.cnblogs.com/xingguozhiming/p/10080304.html