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

JavaScriptで配列内の正負が対応しない唯一の数値を見つける方法

問題の概要

整数の配列を受け取るJavaScript関数を作成する必要があります。この配列には、各数値に対して必ず正負が反転したペア(相方となる数値)が存在します。ただし、例外的に1つの数値だけは、そのペアとなる数値が配列内に存在しません。

私たちのタスクは、そのペアを持たない唯一の数値を見つけ出して返すことです。

解決のアプローチ

この問題は、配列内のすべての数値を合計し、正負それぞれの出現回数の差を利用することで効率的に解けます。

考え方は以下の通りです。

  • 配列内の全要素を合計します。
  • 同時に、正の数(0以上)が出たらカウントを+1、負の数が出たら-1していきます。
  • 最終的に、合計値を「正負のカウント差の絶対値」で割ると、ペアのない数値が求まります。

これは、対応する正負のペア同士は合計すると0になる(互いに打ち消し合う)という性質を利用した賢い手法です。ペアを持たない数値だけが残り、それが答えになります。

コード例

実際のコードを見てみましょう。

const arr = [1, -1, 2, -2, 3];
const findOddNumber = (arr = []) => {
    let count = 0;
    let number = arr.reduce((total, num) => {
        if (num >= 0)
            count++
        else
            count--
        return total + num;
    }, 0)
    return number / Math.abs(count);
};
console.log(findOddNumber(arr));

コードの解説

  • reduceメソッド: 配列の各要素に対して処理を行いながら、合計値(total)を累積していきます。
  • count変数: 正の数ならインクリメント(+1)、負の数ならデクリメント(-1)され、最終的に正負の数の差が記録されます。
  • Math.abs(count): カウント差の絶対値を求めます。上記の例では、正の数が3個(1, 2, 3)、負の数が2個(-1, -2)なので、countは1になります。
  • number / Math.abs(count): 合計値3を絶対値1で割ると、答えの3が得られます。

出力結果

3

配列 [1, -1, 2, -2, 3] の場合、-3 が存在しないため、関数は 3 を返します。期待通りの結果です。

まとめ

この手法を使えば、ループを1回走らせるだけで(O(n))、ペアのない数値を効率的に特定できます。追加の配列やオブジェクトを用意する必要がないため、メモリ面でも優れた解法です。ぜひ実務やコーディングテストの参考にしてください。

  1. 【JavaScript】配列内で最も頻出する単語を上位N件抽出する方法

    問題概要英小文字のみで構成された文字列の配列 arr を第一引数として受け取り、数値 num(num は配列の長さより小さい値)を第二引数として受け取る JavaScript 関数を作成します。この関数は、配列 arr 内で最も頻出する要素を上位 num 件返す必要があります。結果は出現回数が多い順に並べます。また、出現回数が同じ単語が複数ある場合は、辞書順(アルファベット順)で先に来る単語を優先して並べます。入力例const arr = [the, day, is, sunny, the, the, the, sunny, is, is]; const num = 4;出力例const ou

  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