JavaScriptで配列内の奇数回出現する1つの要素を見つける方法
整数の配列が与えられたとき、その中で奇数回だけ出現する要素を1つ見つける関数をJavaScriptで作成します。この問題では、奇数回出現する整数は必ず1つだけ存在することが保証されています。
解き方のアプローチ
ここでは「配列をソートしてから走査する」というシンプルな手法を採用します。配列を昇順に並べ替えると、同じ値の要素が必ず隣り合う状態になるため、各値が何回連続して現れるかを数えやすくなります。あとは配列を先頭から順にループ処理し、出現回数が奇数になっている要素を特定すればよいわけです。
コード例
以下が実際のコードです。
const arr = [20, 1, -1, 2, -2, 3, 3, 5, 5, 1, 2, 4, 20, 4, -1, -2, 5];
const findOdd = arr => {
let count = 0;
let last;
arr.sort((a, b) => a - b);
for (let i = 0; i < arr.length; i++){
if (arr[i] === last) {
count++;
continue;
};
if(count % 2){
return last;
};
last = arr[i];
count = 1;
};
return last;
};
console.log(findOdd(arr));
コードのポイント
この実装の動作を整理すると、次のようになっています。
- last変数: 現在調べている値を保持します。ソート済みのため、同じ値は連続して現れます。
- count変数: 直前の値(last)が連続して出現した回数をカウントします。
- 判定ロジック: 新しい値に切り替わったタイミングで、直前の値の出現回数が奇数かどうかを
count % 2でチェックし、奇数であればその値を返します。
この例の場合、配列をソートすると同じ数字同士が隣り合い、それぞれの出現回数を確認できるようになります。その結果、5だけが3回(奇数回)出現していることが判明します。
実行結果
このコードを実行すると、コンソールには次のように出力されます。
5
なお、補足として、この種の問題はXOR(排他的論理和)を使うとさらに効率的に解くこともできます。同じ値を2回XORすると0になるという性質を利用すれば、ソート不要でO(n)の計算量で答えを求められます。ただし、可読性やデバッグのしやすさを重視するなら、本記事で紹介したソート+カウント方式も十分実用的な選択肢です。
-
【JavaScript入門】配列内で最初の非連続な数値を見つける方法
はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実
-
JavaScriptの配列から奇偶が異なる唯一の要素を返す方法
問題の概要整数の配列 arr を第1引数(かつ唯一の引数)として受け取るJavaScript関数を作成します。この配列には、「すべて偶数+奇数が1個だけ」または「すべて奇数+偶数が1個だけ」という特徴があります。関数の役割は、その中で唯一ほかと性質が異なる要素を見つけ出し、それを返すことです。たとえば、次のような入力が与えられた場合を考えてみましょう。入力const arr = [5, 9, 7, 11, 34, 23, 77];出力const output = 34;出力の解説この配列はほぼすべて奇数で構成されていますが、34 だけが偶数です。したがって、返すべき値は 34 となります。実装