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つの条件をチェックしています。
- 現在の要素が負の数である(
val < 0) - 次の要素が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);
};こちらの書き方では「負の数グループの開始地点」を検出するため、配列の途中でも末尾でも、すべてのクラスターを正確に数えることができます。
-
JavaScriptで文字列内の特定文字の最大連続出現回数を求める方法
本記事では、JavaScriptを使って「文字列の中である1文字が連続して出現する最大回数」を求める方法を解説します。アルゴリズムの考え方から実際のコード、実行結果まで、初心者にもわかりやすく説明していきます。 問題 次のようなJavaScript関数を作成することを目標とします。 第1引数として文字列を受け取る 第2引数として1文字を受け取る その文字が文字列内で連続して出現した最長の回数を数え、返す コード例 以下がその実装コードです。 { const arr = str.split();  
-
JavaScriptで最長のペアチェーンを見つける方法
問題数値ペア(組)の配列 arr を唯一の引数として受け取り、形成可能な最長チェーンの長さを返す JavaScript 関数を作成します。各ペアにおいて、最初の数値は必ず 2 番目の数値より小さいものとします。ここで、ペア (c, d) が別のペア (a, b) の後に続けられるのは、b < c が成り立つ場合に限られると定義します。このルールに従ってペアの連鎖(チェーン)を形成することができ、本関数はその中で最も長いチェーンの長さを求める必要があります。入力例const arr = [ [1, 2], [2, 3], [3, 4] ];出