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

JavaScriptで特定の要素を配列の末尾に移動する方法

問題の概要

本記事では、数値の配列を第一引数として、単一の数値を第二引数として受け取るJavaScript関数の作成方法を解説します。

この関数の役割は、配列の中から第二引数で指定された数値と一致するすべての要素を見つけ出し、それらを配列の末尾に移動させることです。それ以外の要素は元の相対的な順序を保ったまま先頭側にまとめられます。

入力例と期待される出力

たとえば、入力配列が以下の通りだったとしましょう。

const arr = [1, 5, 6, 6, 5, 3, 3];

ここで第二引数として 6 を指定すると、期待される出力は次のようになります。

const output = [1, 5, 5, 3, 3, 6, 6];

ご覧のとおり、6以外の要素(1、5、5、3、3)は元の順序を維持したまま前方に詰められ、6のインスタンスがすべて末尾に集められています。

実装例

以下のコードでは、追加の配列を作らずに元の配列を直接書き換える(in-place)方式で処理を行っています。まず一致しない要素を前から順に詰めていき、その後、残りの位置に指定の数値を埋めるというシンプルなアプローチです。

const arr = [1, 5, 6, 6, 5, 3, 3];
const num = 6;
const shiftElement = (arr, num) => {
    if (arr.length === 0){
        return arr;
    };
    let index = 0;
    for(let e of arr){
        if(e !== num){
            arr[index] = e; index += 1;
        };
    }
    for (; index < arr.length; index++){
        arr[index] = num;
    };
};
shiftElement(arr, num);
console.log(arr);

実行結果

コンソールには以下のように出力されます。

[
1, 5, 5, 3,
3, 6, 6
]

処理の流れのポイント

このアルゴリズムは大きく分けて2つの段階で構成されています。

第1段階:変数 index を「書き込み位置」のポインタとして使い、num と異なる要素だけを先頭から順に再配置します。これにより、一致しない要素同士の相対的な順序が崩れません。

第2段階:一致しない要素の配置が完了した後、index 以降の残りすべての位置に num を代入し、指定した要素を末尾へ集めます。

空の配列が渡された場合も考慮されており、早期リターンによって安全に処理されます。この手法は時間計算量 O(n)、追加メモリ O(1) で実行できるため、要素数の多い配列でも効率的に動作します。

  1. JavaScriptで複数の文字列に共通する文字を重複込みで抽出する方法

    問題文字列の配列 arr を第一引数(かつ唯一の引数)として受け取るJavaScript関数を作成することを考えます。この関数の役割は、配列内のすべての文字列に出現する文字を抽出し、それらを配列として返すことです。重複も含めて扱う必要がある点に注意してください。たとえば、ある文字がすべての文字列の中で2回ずつ出現している場合(3回ではない場合)、最終的な結果にもその文字を2回だけ含めます。入力と出力の例たとえば、関数への入力が次のような場合を考えてみましょう。const arr = [door, floor, crook];r は3つの文字列すべてに1回ずつ現れ、o は door に2回、fl

  2. JavaScriptのreduce()メソッドで配列要素の積を求める方法

    問題JavaScriptで、配列 arr を引数として受け取る関数を作成します。この関数は、配列内のすべての要素を掛け合わせた積を計算し、その結果を返す必要があります。解決策:reduce()メソッドを使う配列の全要素を集約して単一の値を得たい場合、Array.prototype.reduce() メソッドが最適です。reduce() は配列の各要素に対してコールバック関数を順に実行し、結果をアキュムレータ(累積値)に蓄えていきます。積を求める場合は、初期値として「1」を指定するのがポイントです。1は乗法における単位元のため、計算結果に影響を与えず、さらに空の配列が渡された場合でも正しく 1