【JavaScript】配列内にn個連続する奇数が存在するかを判定する方法
問題の概要
本記事では、数値の配列を第1引数に、整数 n を第2引数として受け取り、配列の中に「n 個連続した奇数」が存在するかどうかを判定するJavaScript関数の作成方法を解説します。
この関数は、条件を満たす場合には true を、満たさない場合には false を返す仕様です。
たとえば、入力が次のようなケースを考えてみましょう。
const arr = [3, 5, 3, 5, 4, 3]; const n = 4;
この場合の出力は true になります。理由は、配列の先頭から4つの要素(3, 5, 3, 5)がすべて奇数であるためです。
実装コード
const arr = [3, 5, 3, 5, 4, 3];
const n = 4;
const allOdd = (arr = [], n = 0) => {
// 空の配列の場合は何も返さない
if (!arr.length) {
return;
}
// 連続する奇数の個数を記録する変数
let streak = 0;
for (let i = 0; i < arr.length; i++) {
const el = arr[i];
// 偶数が出たらカウントをリセット
if (el % 2 === 0) {
streak = 0;
} else {
streak++;
}
// n 個連続した時点で true を返す
if (streak === n) {
return true;
}
}
// 最後まで見つからなければ false を返す
return false;
};
console.log(allOdd(arr, n));
コードのポイント
- streak 変数:現在何個の奇数が連続しているかを記録します。
- 偶数の検出:要素を 2 で割った余りが 0 の場合(偶数)、streak を 0 にリセットして連続性を断ち切ります。
- 早期リターン:streak が n に達した瞬間に true を返すため、残りの要素を調べる無駄がありません。
- 空配列の扱い:配列が空の場合は値を返さないため、結果は undefined になります。
実行結果
このコードを実行すると、コンソールには次のように出力されます。
true
計算量について
このアルゴリズムは配列を先頭から一度だけ走査するため、時間計算量は配列の長さに対して線形(O(N))となり、使用するメモリも定数 O(1) で済みます。単純ながら非常に効率的で、大きな配列に対しても高速に動作する実装です。
-
JavaScriptのMath.max()関数とは?複数の数値から最大値を取得する方法
JavaScriptのMathオブジェクトが持つmax()関数は、引数として渡された複数の数値の中から最も大きい値(最大値)を返すメソッドです。引数に1つの数値だけを渡した場合は、その値がそのまま返されます。引数を何も渡さなかった場合は、-Infinity(負の無限大)が返されます。これは「比較対象がない」ことを意味する仕様です。構文(Syntax)Math.max()関数の基本的な構文は以下のとおりです。カンマ区切りで任意の個数の数値を指定できます。Math.max(48, 148, 3654);使用例実際にMath.max()関数を使って、3つの数値から最大値を取得するサンプルコードです。
-
JavaScriptの数値(Number)の基本と実践サンプルコード
JavaScriptでは、整数も小数もすべて「Number」型として扱われます。この記事では、数値変数の定義方法と、それらを使った簡単な演算の例を、動作するHTMLサンプルコードとともに紹介します。サンプルコード以下は、JavaScriptで数値を扱う基本的な例です。整数(22、99)と小数(1.523)を変数に格納し、ボタンをクリックすると画面に表示する仕組みになっています。<!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport co