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

JavaScriptで「ほぼ増加する数列」を判定する方法|コード例でわかりやすく解説

厳密に増加する数列とは?

数列の中で、すべての後続の要素が直前の要素よりも常に大きい場合、その数列は「厳密に増加する数列(strictly increasing sequence)」であるといえます。たとえば [1, 3, 5, 7] のように、左から右へ向かって値が必ず増えていく並びのことです。

今回作成するのは、数値の配列を唯一の引数として受け取るJavaScript関数です。この関数は、「配列から最大でも1つの要素を削除することで、残りの要素が厳密に増加する数列になるかどうか」を判定します。このような状態は一般に「ほぼ増加する数列(almost increasing sequence)」と呼ばれています。

判定ロジックのポイント

  • まず、元の配列がすでに厳密に増加している場合は true を返します。
  • そうでない場合は、配列の各位置から1つずつ要素を取り除いたコピーを作り、それぞれが厳密に増加しているかを順番に確認します。
  • どの削除パターンでも条件を満たせない場合は false を返します。

コード例

以下が実際のコードです。

const almostIncreasingSequence = (arr = []) => {
    if (isIncreasingSequence(arr)) {
        return true;
    };
    for (let i = 0; i < arr.length; i++) {
        let copy = arr.slice(0);
        copy.splice(i, 1);
        if (isIncreasingSequence(copy)) {
            return true;
        };
    };
    return false;
};
const isIncreasingSequence = (arr = []) => {
    for (let i = 0; i < arr.length - 1; i++) {
        if (arr[i] >= arr[i + 1]) {
            return false;
        };
    };
    return true;
};
console.log(almostIncreasingSequence([1, 3, 2, 1]));
console.log(almostIncreasingSequence([1, 3, 2]));

実行結果

コンソールには次のように出力されます。

false
true

結果の解説

[1, 3, 2, 1] の場合、どの要素を1つだけ削除しても厳密に増加する数列にはならないため false が返されます。一方 [1, 3, 2] の場合は、3 を削除すると [1, 2] という厳密に増加する数列になるため、true が返されます。

なお、補助関数 isIncreasingSequence では隣接する要素を比較し、arr[i] >= arr[i + 1] となった時点で即座に false を返しています。「等しい値も許容しない」というのが「厳密な」増加の条件である点に注意してください。

  1. JavaScriptのforEach()でループ内に連番(シーケンス番号)を取得する方法

    JavaScriptでループ処理の中に連番(シーケンス番号)を振りたい場合は、forEach()メソッドを使うのが便利です。カウンター用の変数を用意し、ループが回るたびに値をインクリメントすることで、簡単に連番を生成できます。サンプルコード以下は、ネストされた配列の各要素に対して連番を出力する例です。let studentDetails = [ { id: 101, details: [{name: John}, {name: David}, {name: Bob}] }, { id: 102, details: [{name: Carol}, {n

  2. JavaScriptで配列が「ほぼ増加列」(almostIncreasingSequence)かどうかを判定する方法

    問題の概要 整数の配列として与えられる数列について、最大1つの要素を取り除くだけで厳密に増加する数列(隣り合う要素がすべて a₀ < a₁ < … < aₙ を満たす並び)にできるかどうかを判定します。 なお、要素が1つだけの数列も厳密に増加しているものとみなします。 具体例 例1:false を返すケース sequence = [1, 3, 2, 1] の場合の出力: almostIncreasingSequence(sequence) = false この配列では、どの要素を1つだけ削除しても厳密に増加する数列を作ることができません。 例2:true を返すケース s