【JavaScript】配列をソートせずにn個以上の連続する数値が存在するか判定する方法
本記事では、第一引数に数値の配列、第二引数に整数 n を受け取る JavaScript 関数の作成方法を解説します。
この関数の目的は、配列をソートせずに、n 個以上の連続した数値(例: 4, 5, 6 のような差が 1 の連番)が配列内に存在するかどうかを判定することです。
問題の概要
たとえば、次のような入力が与えられたとします。
const arr = [0, 4, 6, 5, 9, 8, 9, 12];
const n = 3;
この場合、配列には 4、5、6 という 3 つの連続する数値が存在するため、関数は true を返す必要があります。
実装コード
以下がそのコードです。
const arr = [0, 4, 6, 5, 9, 8, 9, 12];
const n = 3;
const findSequence = (arr, num) => {
if(num > arr.length){
return false;
};
let count = 1;
for(let i = 0; i < arr.length; i++){
let el = arr[i];
while(arr.includes(++el)){
count++;
if(count === num){
return true;
};
};
count = 1;
};
return false;
};
console.log(findSequence(arr, n));
console.log(findSequence(arr, 4));
コードの解説
このアルゴリズムの動作を順に見ていきましょう。
- 早期リターン: 要求された連続数 n が配列の長さより大きい場合、連続シーケンスは存在し得ないため、即座に
falseを返します。 - 各要素を起点に探索: 配列の各要素について、「その要素 + 1」「+ 2」という値が配列に含まれるかを
includes()メソッドで順番に確認します。 - カウント管理: 連続する数値が見つかるたびにカウントを増やし、カウントが n に達した時点で
trueを返します。連鎖が途切れたらカウントを 1 に戻して次の要素へ進みます。
この処理により、配列を並べ替えることなく連続する数値の存在を検出できます。ただし includes() は毎回線形探索を行うため、全体の計算量は O(n²) 程度になります。大規模な配列を扱う場合は、あらかじめ Set に変換してから参照するとパフォーマンスを大幅に改善できます。
出力結果
コンソールへの出力は次のようになります。
true
false
n = 3 のときは 4、5、6 という連続した数値が存在するため true、n = 4 のときは 4 個の連続した数値が存在しないため false となります。
-
JavaScriptで配列を波状(ジグザグ)パターンに並べ替える方法
問題数値の配列 arr を唯一の引数として受け取るJavaScript関数を作成します。この関数は、並べ替え後の配列の要素が次のパターンに従うように並べ替える必要があります。arr[0] < arr[1] > arr[2] < arr[3]....このような並べ順は「波状ソート」や「ジグザグソート」と呼ばれることもあります。偶数番目のインデックスの要素は隣接する要素より小さく、奇数番目のインデックスの要素は隣接する要素より大きくなるように配置するのがポイントです。例として、関数への入力が次の場合を考えてみましょう。const arr = [1, 5, 1, 1, 6, 4];
-
JavaScriptで配列を出現頻度の昇順に並べ替える方法
問題数値の配列 arr を唯一の引数として受け取るJavaScript関数を作成する必要があります。配列 arr には重複した要素が含まれている可能性があります。この関数では、出現回数が少ない要素から順に配列を並べ替えます。つまり、出現頻度の低い要素を先頭に配置し、頻度の昇順に沿って残りの要素を並べていきます。なお、出現回数が同じ要素が複数存在する場合は、それらを値の昇順(小さい順)に配置する必要があります。入力例const arr = [5, 4, 5, 4, 2, 1, 12];出力例[1, 2, 12, 4, 4, 5, 5]出力の解説数値「1」「2」「12」はそれぞれ1回しか出現しない