JavaScriptでソート済み配列の最初の一意な要素を見つける方法
この記事では、ソート済みの配列の中から「最初に一度だけ現れる要素」を見つけるJavaScript関数の実装方法を解説します。
問題の概要
たとえば、次のようなリテラルで構成されたソート済み配列があるとします。
const arr = [2, 2, 3, 3, 3, 5, 5, 6, 7, 8, 9];
ここで求められるのは、このような配列を受け取り、配列内で一度だけ出現する最初の数値を返すJavaScript関数を作成することです。
もし該当する数値が配列に存在しない場合は、falseを返す必要があります。
上記の配列の場合、期待される出力は 6 です。2、3、5はそれぞれ複数回出現しているため対象外となり、最初に一度だけ現れるのが6だからです。
実装例
この処理を実現するコードは以下のとおりです。
const arr = [2, 2, 3, 3, 3, 5, 5, 6, 7, 8, 9];
const firstNonDuplicate = arr => {
let appeared = false;
for(let i = 0; i < arr.length; i++){
if(appeared){
if(arr[i+1] !== arr[i]){
appeared = false;
};
}else{
if(arr[i+1] === arr[i]){
appeared = true;
continue;
};
return arr[i];
};
};
return false;
};
console.log(firstNonDuplicate(arr));出力結果
コンソールには以下のように出力されます。
6
コードの解説
このアルゴリズムの最大のポイントは、配列がすでにソートされていることを活かしている点です。同じ値は必ず隣接して並んでいるため、隣り合う要素を比較するだけで重複を検出できます。
- appearedフラグ: 直前の要素が重複していたかどうかを記録するブール値です。
- 重複グループの開始を検出: 現在の要素と次の要素が等しい場合、フラグを立ててその重複グループを読み飛ばします。
- 重複グループの終了を検出: フラグが立っている状態で現在の要素と次の要素が異なれば、フラグを解除して通常の判定モードへ戻ります。
- 一意な要素の発見: フラグが立っておらず、かつ次の要素とも異なる場合、その要素は一度だけ現れる要素なので即座に返します。
ループが最後まで完了しても一意な要素が見つからなかった場合は、falseを返します。計算量はO(n)で、追加のメモリもほとんど不要なため、非常に効率的なアプローチと言えます。
-
【JavaScript入門】配列内で最初の非連続な数値を見つける方法
はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実
-
C#で配列の最初の要素のインデックスを取得する方法
C#で配列の最初の要素のインデックスを取得するには、Array.GetLowerBound(0)メソッドを使用します。このメソッドは、指定した次元における配列の下限(最小インデックス)を返します。 通常のC#配列はインデックス0から始まるため、GetLowerBound(0)は常に「0」を返します。引数の「0」は、対象となる次元(0番目=最初の次元)を指定するものです。 例1:文字列配列の場合 以下のコードでは、文字列配列に対して各種プロパティの状態を確認しつつ、最初の要素のインデックスを取得しています。 using System; public class Demo { public