JavaScriptで配列が回文かどうかを判定する方法
配列の要素を前から読んでも後ろから読んでも同じ順序になっている場合、その配列は「回文(パリンドローム)」であると言えます。本記事では、リテラルの配列を受け取り、それが回文であるかどうかを判定するJavaScript関数の実装方法を解説します。
回文判定の基本的な考え方
回文判定では、配列の先頭と末尾から順番に要素を比較していきます。中央に到達するまで、arr[i] と arr[l-i-1] が一致していることを確認し、1つでも異なる要素があればその時点で false を返します。すべての比較を通過できれば、その配列は回文であり true を返します。
実装コード
実際のコードを見てみましょう。
const arr = [1, 5, 7, 4, 15, 4, 7, 5, 1];
const isPalindrome = arr => {
const { length: l } = arr;
const mid = Math.floor(l / 2);
for (let i = 0; i <= mid; i++) {
if (arr[i] !== arr[l - i - 1]) {
return false;
}
}
return true;
};
console.log(isPalindrome(arr));
コードのポイント
この実装では、以下の点が効率化のポイントになっています。
- 分割代入による長さの取得:
const { length: l } = arr;により、配列の長さを簡潔に変数lに格納しています。 - 中央位置までのループ:
Math.floor(l / 2)で中央インデックスを求め、そこまでの比較だけで判定が完了します。全要素を比較する必要がないため、計算量は O(n/2)、つまり O(n) です。 - 早期リターン: 不一致が見つかった時点で即座に
falseを返すため、無駄な処理が発生しません。
出力結果
上記の例では、配列 [1, 5, 7, 4, 15, 4, 7, 5, 1] は前から読んでも後ろから読んでも同じ並びなので、コンソールには以下が出力されます。
true
別のアプローチ:reverse()を使った方法
よりシンプルに書きたい場合は、every() メソッドやスプレッド構文と reverse() を組み合わせる方法もあります。
const isPalindromeSimple = arr =>
arr.every((val, i) => val === arr[arr.length - 1 - i]);
console.log(isPalindromeSimple([1, 5, 7, 4, 15, 4, 7, 5, 1])); // true
この方法も同様の結果を返しますが、元のforループ版と比べると若干オーバーヘッドがあります。大きな配列を扱う場合は、最初に紹介した中央までの比較方式がより効率的です。
まとめ
配列の回文判定は、先頭と末尾を対にして比較していくことで簡単に実装できます。ループを中央までに限定することで処理を最適化できる点が重要です。文字列の回文判定にも応用できるテクニックなので、ぜひ覚えておきましょう。
-
JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説
JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>
-
JavaScriptで配列の各要素に二次関数f(x)を適用してソートする方法
問題次のような二次関数が与えられています。f(x) = ax² + bx + cここで、a、b、c は3つの定数です。この課題では、ソート済みの整数配列 arr を第1引数に、a、b、c をそれぞれ第2、第3、第4引数として受け取るJavaScript関数を作成します。この関数は、配列 arr の各要素に関数 f(x) を適用し、その結果を昇順にソートした配列を返す必要があります。例えば、関数への入力が次のようであった場合を考えます。const arr = [-8, -3, -1, 5, 7, 9]; const a = 1; const b = 4; const c = 7;この場合、期待さ