求一個數組的最小值,最大值,平均數,中位數與眾數
function sampleStats(count) {
let ret = [], i, j
//眾數
let most = -1;
//中位數
let medium = -1;
//最小值
let minimum = Infinity;
//最大值
let maximum = -Infinity;
//平均值
let average = -1;
//出現次數最多的數出現了多少次
let maxsum = -Infinity;
//用於統計序列中數的個數
let cnt = 0;
//序列和 用於求平均值
let sum = 0;
for (i = 0; i < 256; i++) {
if (count[i] > 0) {
//找最大
if (i > maximum) {
maximum = i;
}
//找最小
if (i < minimum) {
minimum = i;
}
//為了求平均
sum += i * count[i];
cnt += count[i];
//找眾數
if (count[i] > maxsum) {
most = i;
maxsum = count[i];
}
}
}
ret.push(minimum);
ret.push(maximum);
//求平均值
average = sum / cnt;
ret.push(average);
//找中位數
let nextcnt = 0;
if (cnt % 2 == 1) {
//奇數
for (i = 0; i < 256; i++) {
if (count[i] > 0) {
if (nextcnt <= cnt / 2 && nextcnt + count[i] > cnt / 2) {
medium = i;
break;
}
nextcnt += count[i];
}
}
} else {
//偶數
let pre = -1;
for (i = 0; i < 256; i++) {
if (count[i] > 0) {
if (nextcnt < cnt / 2 && nextcnt + count[i] > cnt / 2) {
medium = i;
break;
}
else if (nextcnt == cnt / 2 && nextcnt + count[i] > cnt / 2) {
medium = (i + pre) / 2.0;
break;
}
nextcnt += count[i];
pre = i;
}
}
}
ret.push(medium);
ret.push(most);
return ret;
}
更簡潔的實現
const sampleStats = function(count) {
let min = Infinity;
let max = -Infinity;
let sum = 0;
let totalCount = 0;
let modCount = 0;
let mod;
for (let i = 0; i < count.length; i++) {
if (!count[i]) continue;
sum += i * count[i];
totalCount += count[i];
min = Math.min(min, i);
max = Math.max(max, i);
if (count[i] > modCount) {
modCount = count[i];
mod = i;
}
}
const medIndex1 = Math.floor((totalCount - 1) / 2);
const medIndex2 = Math.ceil((totalCount - 1) / 2);
let index = 0;
let med1, med2;
for (let i = 0; i < count.length; i++) {
if (!count[i]) continue;
index += count[i];
if (med1 === undefined && medIndex1 < index) {
med1 = i;
}
if (medIndex2 < index) {
med2 = i;
break;
}
}
return [min, max, sum / totalCount, (med1 + med2) / 2, mod];
};