ปัญหา
รับอาร์เรย์ arr1, arr2 หา intersection (ค่าที่ซ้ำ) หากค่าใดปรากฏ 2 ครั้งในทั้งสองอาร์เรย์ ให้รวม 2 ครั้งในผลลัพธ์
ตัวอย่าง
const arr1 = [2, 7, 4, 6, 7, 4]; const arr2 = [7, 1, 9, 7, 4, 5];
7 ปรากฏ 2 ครั้งใน arr1 และ 2 ครั้งใน arr2 → ใส่ 2 ครั้ง, 4 ปรากฏ 2 ครั้งใน arr1 และ 1 ครั้งใน arr2 → ใส่ 1 ครั้ง → ผลลัพธ์ [7, 7, 4]
โค้ดตัวอย่าง (Hash Map)
const arr1 = [2, 7, 4, 6, 7, 4]; const arr2 = [7, 1, 9, 7, 4, 5];
const intersect = (arr1 = [], arr2 = []) => {
const map = {};
arr1.forEach(a => { map[a] = (map[a] || 0) + 1; });
const result = [];
for(let key of arr2) {
if(key in map && map[key] > 0) { result.push(key); map[key]--; }
}
return result;
};
console.log(intersect(arr1, arr2));
คำอธิบาย
- นับความถี่ใน arr1
- วน arr2 หากเจอใน map และยังมีจำนวน ให้ push และลดจำนวน
ผลลัพธ์
[7, 7, 4]