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

ตรวจสอบ Mean และ Mode เท่ากันหรือไม่ใน JavaScript

โจทย์

รับอาร์เรย์ตัวเลขที่จัดเรียงแล้ว คำนวณ Mean (ค่าเฉลี่ย) และ Mode (ค่าที่เกิดบ่อยที่สุด) ถ้าเท่ากันคืน true ไม่งั้น false

ตัวอย่าง

const arr = [5, 3, 3, 3, 1];
// Mean = (5+3+3+3+1)/5 = 15/5 = 3
// Mode = 3 (เกิด 3 ครั้ง)
// Output: true

โค้ดตัวอย่าง

const arr = [5, 3, 3, 3, 1];

const mean = arr => arr.reduce((a, b) => a + b) / arr.length;

const mode = arr => {
  let obj = {}, max = 1, mode;
  for (let i of arr) {
    obj[i] = obj[i] || 0;
    obj[i]++;
  }
  for (let i in obj) {
    if (obj.hasOwnProperty(i) && obj[i] > max) {
      max = obj[i];
      mode = i;
    }
  }
  return +mode; // แปลง string เป็น number
};

const meanMode = arr => mean(arr) === mode(arr);

console.log(meanMode(arr));

ผลลัพธ์

true

หมายเหตุ: โจทย์ระบุ "Mean และ Median" แต่โค้ดคำนวณ Mode

ตัวอย่าง: [5, 3, 3, 3, 1]

  • Mean = 3
  • Median = 3 (ค่ากลางของ [1,3,3,3,5])
  • Mode = 3

ในกรณีนี้ Mean = Median = Mode = 3 ทั้งสามค่าเท่ากัน

โค้ดเวอร์ชันครบถ้วน (Mean, Median, Mode)

const statistics = (arr) => {
  if (!arr.length) return { mean: 0, median: 0, mode: null };
  
  const sorted = [...arr].sort((a, b) => a - b);
  const n = sorted.length;
  
  // Mean
  const mean = sorted.reduce((a, b) => a + b, 0) / n;
  
  // Median
  const median = n % 2 === 0 
    ? (sorted[n/2 - 1] + sorted[n/2]) / 2
    : sorted[Math.floor(n/2)];
  
  // Mode
  const freq = {};
  let maxFreq = 0, mode = sorted[0];
  for (const num of sorted) {
    freq[num] = (freq[num] || 0) + 1;
    if (freq[num] > maxFreq) {
      maxFreq = freq[num];
      mode = num;
    }
  }
  
  return { mean, median, mode };
};

const checkMeanMode = (arr) => {
  const { mean, mode } = statistics(arr);
  return mean === mode;
};

const checkMeanMedian = (arr) => {
  const { mean, median } = statistics(arr);
  return mean === median;
};

หลาย Mode (Multimodal)

const getModes = (arr) => {
  const freq = {};
  for (const num of arr) freq[num] = (freq[num] || 0) + 1;
  const maxFreq = Math.max(...Object.values(freq));
  return Object.keys(freq).filter(k => freq[k] === maxFreq).map(Number);
};

console.log(getModes([1, 2, 2, 3, 3])); // [2, 3] - bimodal