JavaScriptで配列内の非負数の連続グループ(クラスター)を数える方法
JavaScriptで配列を扱う際、負の数と非負の数(0以上の値)が混在したデータの中から、「非負の数が連続しているブロック」の数を数えたい場面があります。本記事では、そのような処理を簡潔に実装する方法を解説します。
問題の概要
たとえば、次のような数値の配列があるとします。
const arr = [-1,-2,-1,0,-1,-2,-1,-2,-1,0,1,0];
この配列の中から、0以上の数値が連続して並んでいるグループ(クラスター)を数える関数を作成します。
上記の配列の場合を見てみましょう。
- インデックス3の「0」:単独ですが、これも1つのクラスターとしてカウントされます。
- インデックス9から配列末尾までの「0, 1, 0」:これが2つ目のクラスターです。
したがって、この配列に対する関数の戻り値は 2 となります。
実装コード
以下は、reduce() メソッドを活用したシンプルな実装例です。
const arr = [-1,-2,-1,0,-1,-2,-1,-2,-1,0,1,0];
const positiveClusters = arr => {
return arr.reduce((acc, val, ind) => {
if(val >= 0 && (arr[ind+1] < 0 || typeof arr[ind+1] === 'undefined')){
acc++;
};
return acc;
}, 0);
};
console.log(positiveClusters(arr));コードの仕組み
このロジックのポイントは、各要素について次の2つの条件を同時にチェックしている点です。
- 現在の要素が0以上であること(
val >= 0) - 次の要素が負の数、または存在しない(配列の末尾)であること
この両方を満たすとき、その位置は「1つのクラスターの終わり」にあたるため、カウンターを1つ増やします。初期値0からスタートし、クラスターの終端を検出するたびに加算することで、最終的なグループ数が得られます。
出力結果
このコードを実行すると、コンソールに以下の出力が表示されます。
2
まとめ
reduce() を使えば、ループを明示的に書かずとも、隣接する要素との比較を行いながらクラスター数を効率的に集計できます。条件判定の部分を変更すれば、「正の数のみ」「偶数のみ」といった別のパターンのグループ化にも応用できるので、ぜひ活用してみてください。
-
JavaScriptで各要素より右側にある小さい数字の個数を数える方法
問題概要今回は、数値の配列を唯一の引数として受け取るJavaScript関数を作成します。この関数は、入力された配列をもとに新しい配列を生成します。新しく作られる配列の各要素には、元の配列内で「対応する要素より右側に位置し、かつその値より小さい要素」の個数が格納されます。たとえば、次のような配列を入力したとします。const arr = [4, 7, 1, 4, 7, 5, 3, 8, 9];この場合、期待される出力は以下の通りです。const output = [2, 4, 0, 1, 2, 1, 0, 0, 0];出力結果の解説先頭の「4」よりも右側にあり、値がそれより小さい要素は「1」と
-
JavaScriptで数値を反転する方法|負の数の符号を保持しながら桁を逆順にする
課題今回は、数値を引数として受け取り、その桁を逆順に並べ替えた数値を返すJavaScript関数を作成します。実装時に注意すべき重要なポイントがあります。それは元の数値の符号を保持することです。つまり、負の数を反転させた場合でも、結果は必ず負の数のまま返されなければなりません。コード例以下がその実装コードです。 0) { y = y * 10 + (x % 10); x = Math.floor(x / 10); } return Math.sign(n) * y; } console.log(reverseNumber(num));出力結果-