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

JavaScriptで配列内の連続する負の数のグループ(クラスター)を数える方法

次のような数値の配列があったとします。

const arr = [-1,-2,-1,0,-1,-2,-1,-2,-1,0,1,0];

ここで求められているのは、この配列の中に連続する負の数が何個の「かたまり(クラスター)」として存在するかを数えるJavaScript関数を作成することです。

クラスターとは何か

上記の例を見てみましょう。負の数は次のように2つのグループに分かれています。

  • 先頭の「-1, -2, -1」(0で区切られる)
  • 中盤の「-1, -2, -1, -2, -1」

したがって、この関数が返すべき答えは 2 になります。

reduce() を使った実装例

この問題は、Array.prototype.reduce() メソッドを使うと簡潔に解決できます。コードは以下の通りです。

const arr = [-1,-2,-1,0,-1,-2,-1,-2,-1,0,1,0];
const countClusters = arr => {
    return arr.reduce((acc, val, ind) => {
        if(val < 0 && arr[ind+1] >= 0){
            acc++;
        };
        return acc;
    }, 0);
};
console.log(countClusters(arr));

出力結果

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

2

コードの解説

このコードの仕組みは非常にシンプルです。reduce() は配列の各要素を順番に処理し、アキュムレータ(acc)と呼ばれる累積値を保持しながら処理を進めます。

各要素(val)に対して、次の2つの条件をチェックしています。

  1. 現在の要素が負の数である(val < 0
  2. 次の要素が0以上である(arr[ind+1] >= 0

この両方が成立するということは、「そこでひとつの負の数グループが終わる」ということなので、カウントを1増やしています。初期値を 0 に設定しているため、最終的にグループの総数が返されます。

注意点:配列の末尾が負の数の場合

上記のコードには1点留意すべき挙動があります。「次の要素が0以上」という条件で判定しているため、配列の最後が負の数で終わっている場合、そのグループはカウントされません。これも正しく数えたい場合は、判定条件を少し変更しましょう。

const countClusters = arr => {
    return arr.reduce((acc, val, ind) => {
        // 現在が負で、直前の要素が負でなければ新しいグループの開始
        if(val < 0 && !(ind > 0 && arr[ind-1] < 0)){
            acc++;
        };
        return acc;
    }, 0);
};

こちらの書き方では「負の数グループの開始地点」を検出するため、配列の途中でも末尾でも、すべてのクラスターを正確に数えることができます。

  1. JavaScriptで文字列内の特定文字の最大連続出現回数を求める方法

    本記事では、JavaScriptを使って「文字列の中である1文字が連続して出現する最大回数」を求める方法を解説します。アルゴリズムの考え方から実際のコード、実行結果まで、初心者にもわかりやすく説明していきます。 問題 次のようなJavaScript関数を作成することを目標とします。 第1引数として文字列を受け取る 第2引数として1文字を受け取る その文字が文字列内で連続して出現した最長の回数を数え、返す コード例 以下がその実装コードです。 {     const arr = str.split();     

  2. JavaScriptで最長のペアチェーンを見つける方法

    問題数値ペア(組)の配列 arr を唯一の引数として受け取り、形成可能な最長チェーンの長さを返す JavaScript 関数を作成します。各ペアにおいて、最初の数値は必ず 2 番目の数値より小さいものとします。ここで、ペア (c, d) が別のペア (a, b) の後に続けられるのは、b < c が成り立つ場合に限られると定義します。このルールに従ってペアの連鎖(チェーン)を形成することができ、本関数はその中で最も長いチェーンの長さを求める必要があります。入力例const arr = [     [1, 2], [2, 3], [3, 4] ];出