JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptでソートされていない配列から欠落している1つの数字を見つける方法

問題の概要

1からnまでの連続した整数が含まれるはずの配列を受け取り、欠落している1つの数字を見つけて返すJavaScript関数を作成します。この配列には次の2つの特徴があります。

  • 1つの数字だけが欠落している
  • 要素がランダムな順序で格納されている(未ソート)

解決のアプローチ:等差数列の和の公式

最もシンプルかつ効率的な方法は、ガウスの和の公式を利用することです。1からnまでの整数の合計は「n × (n + 1) ÷ 2」で求めることができます。

具体的な手順は以下の通りです。

  1. 実際の合計reduce()メソッドを使って、配列内の全要素の合計を計算する
  2. 理論上の合計:欠落した数字を含む完全な数列の合計を公式から算出する
  3. 差分を求める:理論値から実際の合計を引くと、それがまさに欠落している数字になる

この方法なら、配列をソートする必要がなく、計算量はO(n)で済むため非常に高速です。

コード例

以下が実際のコードです。

const arr = [4, 7, 1, 8, 9, 5, 2, 3];
const findMissing = (arr = []) => {
    // 配列内の全要素の合計を計算
    const sumArr = arr.reduce((acc, val) => acc + val);
    const { length: len } = arr;
    // 完全な数列(1〜len+1)の理論上の合計を計算
    const sumFirst = (len + 1) * (len + 2) * .5;
    // 差分が欠落している数字
    const missing = sumFirst - sumArr;
    return missing;
};
console.log(findMissing(arr));

コードのポイント

ここで注目すべき点は、配列の長さがlenの場合、本来含まれるべき数字は1からlen + 1までであるという点です。そのため、理論上の合計を計算する際は(len + 1)(len + 2)を使用しています。

また、* .5による掛け算は「÷2」と同じ意味で、浮動小数点演算を避けたい場合は/ 2としても同じ結果になります。

出力結果

6

サンプルの配列[4, 7, 1, 8, 9, 5, 2, 3]には8個の要素があり、本来は1〜9の数字が含まれるはずです。この中で欠けているのが6であり、プログラムも正しく6を出力しています。

まとめ

ソート不要・線形時間で動作するこの手法は、面接や競技プログラミングでも頻出の定番テクニックです。配列の順序に依存せず、合計値の差分だけで欠損値を特定できる点が大きな魅力と言えるでしょう。

  1. JavaScriptで配列内の最長フィボナッチ部分列を見つける方法

    フィボナッチ数列とは 数列 X_1, X_2, ..., X_n がフィボナッチ数列であるとは、以下の条件を満たすことを指します。 n >= 3 である すべての i + 2 <= n に対して、X_i + X_{i+1} = X_{i+2} が成り立つ つまり、隣り合う2項の和が常に次の項になる数列のことです。 問題の概要 数値の配列 arr を第1引数(唯一の引数)として受け取り、配列 arr 内に存在する最長のフィボナッチ部分列の長さを見つけて返すJavaScript関数を作成する必要があります。 ここでいう「部分列」とは、元の配列 arr から任意の個数の要素(0個で

  2. JavaScriptで配列内の特定の数値に最も近い2つの要素を検索する方法

    問題の概要JavaScriptで、ソート済みの整数配列 arr を第一引数に、目標となる数値 target を第二引数に受け取る関数を作成します。この関数は、配列内に存在する要素の中から target に最も近い2つの数値を選び、それらを昇順に並べた配列として返す必要があります。例えば、以下のような入力が与えられた場合を考えてみましょう。入力:const arr = [1, 2, 3, 4, 5];const target = 3;出力:const output = [2, 3];この場合、target の値が 3 であるため、最も近い2つの要素は 2 と 3 となり、昇順に並べて [2, 3