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))、ペアのない数値を効率的に特定できます。追加の配列やオブジェクトを用意する必要がないため、メモリ面でも優れた解法です。ぜひ実務やコーディングテストの参考にしてください。
-
【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
-
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