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

【JavaScript】右側のどの要素よりも大きい要素だけを抽出したサブ配列を返す方法

今回は、数値の配列を受け取り、その中から「自分より右側にあるすべての要素よりも大きい」要素だけを抜き出してサブ配列として返すJavaScript関数を作成します。

例えば、配列 [12, 45, 6, 4, 23, 23, 21, 1] を見てみましょう。
4523211 の4つの要素は、それぞれの位置から右側を見ても、自分より大きな値が存在しません。一方、12 の右側には 45 があるため条件を満たしません。よって期待される結果は [1, 21, 23, 45] となります。

実装のアプローチ

この問題は、配列を右から左へ走査しながら「それまでに見つかった最大値」を記録していくことで、たった一度のループで効率よく解けます。
Array.prototype.reduceRight() メソッドを使えば、この処理を非常に簡潔に記述できます。

コード例

const arr = [12, 45, 6, 4, 23, 23, 21, 1];
const largerThanRight = (arr = []) => {
    const creds = arr.reduceRight((acc, val) => {
        let { largest, res } = acc;
        if(val > largest){
            res.push(val);
            largest = val;
        };
        return { largest, res };
    }, {
        largest: -Infinity,
        res: []
    });
    return creds.res;
};
console.log(largerThanRight(arr));

出力結果

コンソールには次のように表示されます。

[ 1, 21, 23, 45 ]

コードの解説

  • reduceRight() を使うことで、配列の末尾(右端)から先頭へ向かって要素を順番に処理できます。
  • アキュムレータ(acc)には、それまでに処理した要素の最大値 largest と、結果を格納する配列 res の2つのプロパティを持たせています。
  • 初期値の largest-Infinity を設定することで、最初の要素(右端)とどんな数値でも正しく比較できるようになっています。
  • 現在の要素が largest より大きい場合のみ、res に追加して最大値を更新します。これにより、「右側にそれより大きい要素が存在しない」要素だけが残ります。
  • 右から左へ処理しているため、結果の配列は自然と昇順に並びます。

まとめ

reduceRight() を活用すれば、追加のループや複雑な条件分岐なしに、O(n) の計算量でこの問題を解決できます。「右側の要素との比較」という種類の問題では、右から走査する発想が非常に有効なので、ぜひ覚えておきましょう。

  1. JavaScriptで配列内の出現回数が2番目に多い要素を取得する方法

    この記事では、リテラル値の配列を受け取り、その中で出現回数が2番目に多い要素を返すJavaScript関数の実装方法を解説します。問題の概要例として、入力配列が以下の場合を考えてみましょう。const arr = [2, 5, 4, 3, 2, 6, 5, 5, 7, 2, 5];この配列では、5が4回、2が3回出現しています。つまり、最も多く出現する要素は5であり、2番目に多く出現する要素は2です。したがって、期待される出力は次のようになります。const output = 2;アルゴリズムの流れ空のオブジェクト(マップ)を作成し、各要素の出現回数を記録します。配列を走査しながら、各要素のカ

  2. 【JavaScript】配列内のすべての単語をメッシュ化して、つなぎの文字を取得する方法

    問題 2つの単語は、最初の単語の末尾の部分文字列が次の単語の先頭の部分文字列と一致するとき、「メッシュ(連結)」できると言えます。たとえば、「robinhood」と「hoodie」は「hood」という部分でつながるため、メッシュ化が可能です。 この記事では、文字列の配列を受け取るJavaScript関数を作成します。配列内のすべての単語が順番にメッシュ化できる場合は、つなぎとなる共通部分を連結した文字列を返し、1組でもつながらないペアがあれば空文字列を返すようにします。 アルゴリズムの考え方 隣接する2つの単語をスペースで連結した文字列に対し、後方参照を使った正規表現 /(.+) \1/ を