JavaScriptで配列内の最初の重複要素のインデックスを検索する方法
文字列や数値のリテラルを含む配列には、重複した要素が存在する場合と存在しない場合があります。
この記事では、配列を受け取り、最初に重複している要素のインデックスを返す関数の実装方法を解説します。もし配列内に重複する要素がひとつも存在しない場合は、-1 を返す仕様とします。
実装の考え方
基本的なアプローチは以下の通りです。
- for ループで配列を先頭から順番に走査する
- オブジェクト(Map)を用意し、「まだ出現していない要素」をキーとして、そのインデックスを値として保存する
- 走査中にすでに登録済みのキー(=重複要素)に遭遇したら、そのインデックスを即座に返す
- ループが最後まで完了した場合は重複がなかったことを意味するため、-1 を返す
コード例
const arr = [12,4365,76,43,76,98,5,31,4];
const secondArr = [6,8,9,32,1,76,98,0,65,878,90];
const findRepeatingIndex = (arr) => {
const map = {};
for(let i = 0; i < arr.length; i++){
if(map[arr[i]]){
return map[arr[i]];
}else{
map[arr[i]] = i;
}
}
return -1;
};
console.log(findRepeatingIndex(arr));
console.log(findRepeatingIndex(secondArr));出力結果
コンソールには以下のように出力されます。
2 -1
処理の流れの解説
1つ目の配列 [12,4365,76,43,76,98,5,31,4] の場合、値 76 はインデックス 2 に最初に出現し、インデックス 4 で再び現れます。したがって、関数は最初の出現位置である 2 を返します。
一方、2つ目の配列には重複する要素が存在しないため、ループが最後まで完了し、-1 が返されます。
計算量について
この実装では、各要素に対して Map へのアクセス・登録がそれぞれ O(1) で行えるため、全体の計算量は O(n)、空間計算量も O(n) となります。二重ループを使う素朴な実装(O(n²))と比べて、大きな配列でも高速に動作するのがメリットです。
-
JavaScriptのimportで波括弧「{}」を使う理由とは?名前付きエクスポートの基本をわかりやすく解説
JavaScript(ESモジュール)でモジュールを読み込む際、import 文に波括弧 { } を付けるかどうか迷ったことはありませんか?実はこの波括弧は、名前付きエクスポート(named export)を読み込むために必要な記法です。本記事では、実際のコード例を使いながら、{ } の役割と使い方を詳しく解説します。 importで { } を使う場面とは JavaScriptのESモジュールでは、エクスポート方法によって読み込み側の書き方が変わります。 名前付きエクスポート:export { 関数名 } のようにエクスポートされたものを読み込む場合は、import { 名前 } fro
-
C++を使って文字列内で最初に繰り返される文字を検索する方法
文字列が与えられたとき、その中で最初に繰り返されて出現する文字を見つけたいことがあります。例えば、文字列が「Hello Friends」である場合、「l」という文字が2回連続して現れるため、最初に繰り返される文字は「l」となります。 この問題を効率的に解決するには、ハッシュ(ハッシュセット)を利用した手法が有効です。具体的には、ハッシュセットを1つ用意し、文字列の各文字を先頭から順に走査していきます。走査中の文字がまだセットに存在しない場合はセットに挿入し、すでに存在している場合はその時点の文字が「最初に繰り返される文字」となるため、それを返します。 このアルゴリズムの計算量は、文字列の長さを