AlgoDaily 01: Array Intersection
I’ve signed up to AlgoDaily as it seems like a fun way to get out some small blog posts on small coding tasks.
This is AlgoDaily Day 1: Array Intersection.
“Can you write a function that takes two inputs and returns their intersection? All element in the final result should be unique.”
const nums1 = [1, 2, 2, 1];
const nums2 = [2, 2];
intersection(nums1, nums2);
// [2]
“Here’s another one:”
const nums1 = [4, 9, 5];
const nums2 = [9, 4, 9, 8, 4];
intersection(nums1, nums2);
// [9, 4]
Here’s my first-thought naive implementation:
function intersection(setA, setB) {
return setA.reduce((intersected, x) => {
if (setB.includes(x) && !intersected.includes(x)) {
intersected.push(x);
}
return intersected;
}, []);
}
The idea is to filter setA
to those that are also in setB
, while also
ignoring duplicate items.
Testing it out:
intersection([1, 2, 2, 1], [2, 2]);
// Array [ 2 ]
intersection([4, 9, 5], [9, 4, 9, 8, 4]);
// Array [ 4, 9 ]
It might be more straightforward to just do a filter and then use a Set
to
remove the duplicates:
function intersection(arrayA, arrayB) {
return [...new Set(setA.filter(x => setB.includes(x)))]
}
That does seem a lot cleaner.
Going through the test cases in AlgoDaily:
intersection([6, 0, 12, 10, 16], [3, 15, 18, 20, 15]);
// Array []
intersection([1, 5, 2, 12, 6], [13, 10, 9, 5, 8]);
// Array [ 5 ]
intersection([4, 17, 4, 4, 15, 16, 17, 6, 7], [15, 2, 6, 20, 17, 17, 8, 4, 5]);
// Array(4) [ 4, 17, 15, 6 ]
intersection([3], [15]);
// Array []
intersection([2, 16, 8, 9], [14, 15, 2, 20]);
// Array [ 2 ]
It turns out that AlgoDaily‘s suggested solution is very similar to the
version using Set()
.