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

【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) で済みます。単純ながら非常に効率的で、大きな配列に対しても高速に動作する実装です。


  1. JavaScriptのMath.max()関数とは?複数の数値から最大値を取得する方法

    JavaScriptのMathオブジェクトが持つmax()関数は、引数として渡された複数の数値の中から最も大きい値(最大値)を返すメソッドです。引数に1つの数値だけを渡した場合は、その値がそのまま返されます。引数を何も渡さなかった場合は、-Infinity(負の無限大)が返されます。これは「比較対象がない」ことを意味する仕様です。構文(Syntax)Math.max()関数の基本的な構文は以下のとおりです。カンマ区切りで任意の個数の数値を指定できます。Math.max(48, 148, 3654);使用例実際にMath.max()関数を使って、3つの数値から最大値を取得するサンプルコードです。

  2. JavaScriptの数値(Number)の基本と実践サンプルコード

    JavaScriptでは、整数も小数もすべて「Number」型として扱われます。この記事では、数値変数の定義方法と、それらを使った簡単な演算の例を、動作するHTMLサンプルコードとともに紹介します。サンプルコード以下は、JavaScriptで数値を扱う基本的な例です。整数(22、99)と小数(1.523)を変数に格納し、ボタンをクリックすると画面に表示する仕組みになっています。<!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport co