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

JavaScriptでソート済み配列から重複要素を削除する方法

ここでは、ソート済みのリテラル配列が与えられた状況を想定します。求められているのは、配列内のすべての重複をその場(in-place)で削除し、各要素が一度だけ出現するようにしたうえで、新しい配列の長さを返す関数を作成することです。

制約条件

この問題には重要な条件があります。それは、別の配列用に余分な領域を確保してはならないという点です。つまり、O(1)の追加メモリしか使わず、入力された配列そのものを直接変更する形で処理を実装する必要があります。

コード例

実際のコードは以下のようになります。

const arr = [1, 3, 3, 6, 7, 7, 9, 11, 13];
const removeDuplicates = (arr = []) => {
    let i = 0;
    while(i < arr.length - 1){
        let j = i + 1;
        if(arr[i] === arr[j]){
            arr.splice(j, 1);
        }else{
            i++;
        }
    };
};
removeDuplicates(arr);
console.log(arr);

仕組みの解説

このアルゴリズムのポイントは以下の通りです。

  • インデックスiとその次のj = i + 1にある要素を比較します。
  • 両者が等しい場合、配列はソート済みなので重複と判断でき、splice()メソッドでj番目の要素を削除します。
  • 異なる場合はiを進めて次のペアの比較に移ります。

隣接する要素同士の比較だけで済むのは、配列があらかじめソートされているためです。これにより、追加の配列を一切使わずに重複だけを取り除くことができます。なお、新しい長さを返したい場合は、ループ終了後にreturn arr.length;を追加すれば対応できます。

実行結果

コンソールに出力される結果は以下の通りです。

[
    1, 3, 6, 7,
    9, 11, 13
]
  1. 【初心者向け】JavaScriptのArray.from()メソッドの使い方を実例で解説

    JavaScript の Array.from() メソッドは、length プロパティを持つオブジェクト(配列風オブジェクト)や、文字列・Map・Set などの反復可能(イテラブル)なオブジェクトから、新しい Array オブジェクトを生成して返すためのメソッドです。元のオブジェクトは変更されず、常に新しい配列インスタンスが返されます。 基本構文 Array.from(obj, mapFunction, val) パラメータの説明 obj:配列へ変換したい対象のオブジェクト。配列風オブジェクト(length プロパティを持つもの)や反復可能なオブジェクトを指定します。 mapFunctio

  2. JavaScriptのArray.from()メソッドとは?使い方と実例をわかりやすく解説

    Array.from()メソッドは、配列風オブジェクト(array-like)や反復可能オブジェクト(iterable)から、新しい配列オブジェクトを作成するための便利なメソッドです。文字列、Map、Set、NodeListなど、さまざまなデータを手軽に配列へ変換できます。 Array.from()の基本的な動作 例えば、文字列「HelloWorld」に対してArray.from()を使用すると、1文字ずつ分割された新しい配列が生成されます。以下に実際のコード例を示します。 サンプルコード <!DOCTYPE html> <html lang="ja"&g