โจทย์
รับอาร์เรย์ตัวเลข คำนวณ ผลรวม (Sum) และ ผลคูณ (Product) แล้วหา ความต่างสัมบูรณ์ (Absolute Difference)
ตัวอย่าง
const arr = [1, 4, 1, 2, 1, 6, 3]; // Sum = 1+4+1+2+1+6+3 = 18 // Product = 1×4×1×2×1×6×3 = 144 // |18 - 144| = 126
โค้ดตัวอย่าง (Reduce)
const arr = [1, 4, 1, 2, 1, 6, 3];
const sumProductDifference = (arr = []) => {
const creds = arr.reduce((acc, val) => {
let { sum, product } = acc;
sum += val;
product *= val;
return { sum, product };
}, { sum: 0, product: 1 });
const { sum, product } = creds;
return Math.abs(sum - product);
};
console.log(sumProductDifference(arr));
ผลลัพธ์
126
วิธีทันสมัย (ES6+)
1. Destructuring ใน Reduce
const sumProductDiff = (arr) => {
const { sum, product } = arr.reduce(
({ sum, product }, val) => ({ sum: sum + val, product: product * val }),
{ sum: 0, product: 1 }
);
return Math.abs(sum - product);
};
2. แยกคำนวณ (อ่านง่ายกว่า)
const sumProductDiffSimple = (arr) => {
const sum = arr.reduce((a, b) => a + b, 0);
const product = arr.reduce((a, b) => a * b, 1);
return Math.abs(sum - product);
};
3. ใช้ for...of (เร็วที่สุด)
const sumProductDiffFast = (arr) => {
let sum = 0, product = 1;
for (const val of arr) {
sum += val;
product *= val;
}
return Math.abs(sum - product);
};
กรณีพิเศษ
| Input | Sum | Product | Diff |
|---|---|---|---|
| [] | 0 | 1 | 1 |
| [0, 1, 2] | 3 | 0 | 3 |
| [-1, -2, 3] | 0 | 6 | 6 |
| [1000000] | 1000000 | 1000000 | 0 |
ประสิทธิภาพ
- for...of เร็วที่สุด (ไม่มี function call overhead)
- Reduce สะดวกแต่ช้ากว่าเล็กน้อย
- Product อาจ overflow (JavaScript ใช้ IEEE 754 - safe integer จนถึง 2⁵³-1)
BigInt Version (สำหรับตัวเลขใหญ่มาก)
const sumProductDiffBigInt = (arr) => {
let sum = 0n, product = 1n;
for (const val of arr) {
sum += BigInt(val);
product *= BigInt(val);
}
return (sum > product ? sum - product : product - sum).toString();
};