โจทย์
รับอาร์เรย์ตัวเลขที่จัดเรียงแล้ว คำนวณ 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