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

【JavaScript】2つの配列を結合して連続した数列が作れるか判定する方法

本記事では、2つの数値配列を受け取り、それらを組み合わせて「連続した数列(等差数列)」を構成できるかどうかを判定するJavaScript関数の実装方法を解説します。

要件の整理

この関数は、引数として2つの数値配列を受け取ります。そして、両方の配列の要素をすべて結合し、任意の順序に並べ替えたときに連続した数列が作れる場合は true を、作れない場合は false を返します。

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

const arr1 = [4, 6, 2, 9, 3];
const arr2 = [1, 5, 8, 7];

この2つの配列を結合して昇順に並べると「1, 2, 3, 4, 5, 6, 7, 8, 9」という連続した数列になるため、期待される出力は true です。

実装の考え方

判定のロジックはシンプルで、以下の手順で構成できます。

  1. スプレッド構文(...)を使って2つの配列を1つに結合する
  2. 結合した配列を昇順にソートする
  3. 先頭の2要素から公差(隣接要素間の差)を求める
  4. 残りの要素を順に走査し、公差と異なる差が1つでも見つかれば false を返す
  5. 最後まで問題なければ true を返す

なお、要素数が2未満の場合はどのような値でも連続した数列とみなせるため、そのまま true を返します。計算量はソート処理が支配的となるため、O(n log n) となります。

サンプルコード

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

const arr1 = [4, 6, 2, 9, 3];
const arr2 = [1, 5, 8, 7];

const canFormSequence = (arr1, arr2) => {
   // 2つの配列を結合して昇順にソート
   const combined = [...arr1, ...arr2].sort((a, b) => a - b);

   // 要素が2つ未満なら常に連続数列とみなせる
   if (combined.length < 2) {
      return true;
   }

   // 隣接要素間の公差を求める
   const step = combined[1] - combined[0];

   // 公差が一定であるかを全要素でチェック
   for (let i = 1; i < combined.length - 1; i++) {
      if (combined[i + 1] - combined[i] !== step) {
         return false;
      }
   }
   return true;
};

console.log(canFormSequence(arr1, arr2));

出力結果

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

true

  1. 【JavaScript】2つの配列を1つのオブジェクトに変換する方法をわかりやすく解説

    2つの配列を1つのJavaScriptオブジェクトに変換できる? はい、可能です。JavaScriptでは「キー」となる配列と「値」となる配列の2つを組み合わせて、1つのオブジェクトを作成できます。最も基本的な方法は、forEach()メソッドで片方の配列をループ処理しながら、もう片方の配列の対応する要素を値として代入していくやり方です。 以下に、実際に動作するサンプルコードを紹介します。 コード例 <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name

  2. JavaScriptで配列の要素が2乗の関係かどうかをチェックする方法

    問題 2つの数値の配列 arr1 と arr2 をそれぞれ第1・第2引数として受け取るJavaScript関数を作成することを考えます。 この関数は、arr2 のすべての要素が、出現順序に関係なく arr1 のいずれかの要素の2乗と一致する場合にのみ true を返し、それ以外の場合は false を返す必要があります。 たとえば、関数への入力が次のようであった場合を考えてみましょう。 入力 const arr1 = [4, 1, 8, 5, 9]; const arr2 = [81, 1, 25, 16, 64]; 出力 const output = true; この場合、81 = 9²、