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

【JavaScript】入力配列の各要素について「右側にある小さい要素の個数」を数えた配列を作成する方法

問題

数値の配列を受け取り、それをもとに出力用の配列を構築する JavaScript の関数を作成することを考えます。

出力配列の各要素には、入力配列の対応する要素よりも右側に存在し、かつその要素より小さい数値の個数を格納します。最後に、この配列を返します。

例えば、[6, 2, 8, 5, 1, 3] という入力に対しては、以下のような出力が期待されます。

  • 6 の右側にある小さい数 → 2, 5, 1, 3 の 4 個
  • 2 の右側にある小さい数 → 1 の 1 個
  • 8 の右側にある小さい数 → 5, 1, 3 の 3 個
  • 5 の右側にある小さい数 → 1, 3 の 2 個
  • 1 の右側にある小さい数 → 0 個
  • 3 の右側にある小さい数 → 0 個

コード例

以下が実際のコードです。

const arr = [6, 2, 8, 5, 1, 3];
const buildSmallerArray = (arr = []) => {
    let count;
    let base;
    const res = [];
    for (let i = 0; i < arr.length; i++) {
        base = arr[i];
        count = 0;
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[j] < base) count++;
        };
        res.push(count);
    };
    return res;
};
console.log(buildSmallerArray(arr));

出力

[ 4, 1, 3, 2, 0, 0 ]

コードの解説

この実装では二重ループを使っています。

  1. 外側のループで、基準となる要素(base)を先頭から順に取り出します。
  2. 内側のループで、基準要素より右側にあるすべての要素と比較し、基準より小さい数が見つかるたびに count をインクリメントします。
  3. 各要素のカウント結果を順番に res 配列へ追加し、最後に結果として返します。

なお、このアプローチの時間計算量は O(n²) です。配列のサイズが非常に大きい場合は、Binary Indexed Tree(BIT)やマージソートを応用した手法で O(n log n) まで高速化することも可能ですが、シンプルさと可読性を重視するなら上記の二重ループによる実装が分かりやすくおすすめです。

  1. JavaScriptで配列の要素を同じ配列内に複製する方法

    JavaScriptでは、concat()メソッドとsort()メソッドを組み合わせることで、既存の配列の要素を同じ配列内に複製することができます。ここでは、実際に動作するサンプルコードを使って、その手順をわかりやすく解説します。 コード例 以下は、配列の要素を同じ配列内に複製するためのコード例です。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" cont

  2. 【JavaScript】ユーザーが入力した文字列が配列に含まれているかチェックする方法

    本記事では、ユーザーに文字列を入力してもらうための入力欄を備えたJavaScriptプログラムを作成します。 プログラムは、入力された値が、あらかじめコード内で定義しておいた配列の要素と一致するかどうかを判定します。入力された文字列が配列内に存在すれば画面に「true」を、存在しなければ「false」を表示します。 実装例 この動作を実現するコードは以下のとおりです。 <!DOCTYPE html> <html> <head>     <meta charset="utf-8"> &nb