Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

ความต่างระหว่างผลรวมและผลคูณของอาร์เรย์ใน JavaScript

โจทย์

รับอาร์เรย์ตัวเลข คำนวณ ผลรวม (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);
};

กรณีพิเศษ

InputSumProductDiff
[]011
[0, 1, 2]303
[-1, -2, 3]066
[1000000]100000010000000

ประสิทธิภาพ

  • 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();
};