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