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

【JavaScript】配列の要素を並べ替えて連続した数列が作れるか判定する方法

本記事では、数値の配列を受け取り、その要素を並べ替えることで連続した数列(1ずつ増加する等差数列)を作れるかどうかを判定するJavaScript関数の実装方法を解説します。

問題の概要

例えば、次のような配列が与えられたとします。

const arr = [3, 1, 4, 2, 5];

この配列は「1, 2, 3, 4, 5」という連続した数列に並べ替えられるため、関数の出力は true になります。

実装例

実際のコードは以下の通りです。

const arr = [3, 1, 4, 2, 5];
const canBeConsecutive = (arr = []) => {
    if(!arr.length){
        return false;
    };
    const copy = arr.slice();
    copy.sort((a, b) => a - b);
    for(let i = copy[0], j = 0; j < copy.length; i++, j++){
        if(copy[j] === i){
            continue;
        };
        return false;
    };
    return true;
};
console.log(canBeConsecutive(arr));

コードの解説

この関数は以下の手順で動作します。

  1. 空配列のチェック: 配列が空の場合は false を返します。
  2. 配列のコピー: slice() を使って元の配列のコピーを作成し、元の配列が変更されないようにしています。
  3. 昇順ソート: sort((a, b) => a - b) でコピーを数値として昇順にソートします。比較関数を指定しないと文字列としてソートされてしまうため注意が必要です。
  4. 連続性の確認: ループで各要素を先頭の値から順番に照合し、すべての要素が「先頭の値から1ずつ増加する」並びになっていれば true を返し、途中で一致しない箇所があれば即座に false を返します。

出力結果

コンソールには以下のように表示されます。

true

まとめ

このように、配列をコピーしてソートし、隣接する要素の差が常に1であることを確認することで、要素を並べ替えた際に連続した数列を形成できるかどうかを簡単に判定できます。
重複や欠落がある配列でも正しく false を返すため、データ検証などの用途にも応用できます。

  1. JavaScriptのreduce()メソッドで配列要素の積を求める方法

    問題JavaScriptで、配列 arr を引数として受け取る関数を作成します。この関数は、配列内のすべての要素を掛け合わせた積を計算し、その結果を返す必要があります。解決策:reduce()メソッドを使う配列の全要素を集約して単一の値を得たい場合、Array.prototype.reduce() メソッドが最適です。reduce() は配列の各要素に対してコールバック関数を順に実行し、結果をアキュムレータ(累積値)に蓄えていきます。積を求める場合は、初期値として「1」を指定するのがポイントです。1は乗法における単位元のため、計算結果に影響を与えず、さらに空の配列が渡された場合でも正しく 1

  2. JavaScriptで昇順配列の中から並び順を壊している唯一の要素を見つける方法

    この記事では、昇順(増加順)にソートされた数値の配列の中に、ただひとつだけ並び順を乱している要素がある場合に、その要素を特定して返すJavaScript関数の実装方法を解説します。 問題の定義 扱う配列は基本的に昇順でソートされていますが、その中の要素がひとつだけ順序から外れています。関数の目的は、その「異常な要素」を見つけ出して返すことです。 たとえば、次のような配列を考えます。 const arr = [1, 2, 3, 4, 17, 5, 6, 7, 8]; この配列から「17」を取り除けば残りは完全な昇順になるため、求める答えは「17」です。 解決のアプローチ 昇順の配列では、隣り合う