2108-統計学


統計学の問題に移動
質問する

マイコード
const [n, ...arr] = require("fs")
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .split("\n");

const obj = {};
const numbers = arr
  .map((el) => {
    if (obj[el]) obj[el] += 1;
    else obj[el] = 1;
    return Number(el);
  })
  .sort((a, b) => a - b);

const modeTimes = Math.max(...Object.values(obj));
const modeArr = [
  ...new Set(
    Object.keys(obj)
      .sort((a, b) => a - b)
      .filter((el) => obj[el] === modeTimes)
  ),
];
const avg = Math.round(
  numbers.reduce((acc, cur) => acc + cur, 0) / numbers.length
);

console.log(avg === -0 ? 0 : avg);
console.log(numbers[Math.floor(numbers.length / 2)]);
console.log(modeArr[1] || modeArr[0]);
console.log(numbers[numbers.length - 1] - numbers[0]);
難点
実はアルゴリズムと問題を解くのは難しくないと思います.
しかし、最も頻繁な値を探しているところで、メモリが超過したり、タイムアウトしたり、異常に66%程度でエラーが発生したりして、頭が痛くなります.
メモリ過剰量は、numbers配列とobjオブジェクトのみを生成できます.メモリ過剰の問題を解決し、タイムアウトの問題も自然に解決しました.ただ並びが多くなり、繰り返し回数も多くなったのでタイムアウトしたようです.なぜ66%が間違っているのか分かりません.
const modeArr = [
  ...new Set(
    Object.keys(obj)
      .sort((a, b) => a - b)
      .filter((el) => obj[el] === modeTimes)
  ),
];
この部分のObject.keys(obj).sort((a, b) => a - b)はもともとnumbersだったのですが、このように変えて解決しました.ソートや繰り返しが問題かもしれません.