JavaScriptで左右の合計が等しくなる「バランスインデックス」を配列から見つける方法
問題
整数の配列 arr を唯一の引数として受け取る JavaScript 関数を作成する必要があります。
この関数は、指定したインデックスの左側にある要素の合計と右側にある要素の合計が等しくなるようなインデックスを1つ見つけて返します。該当するインデックスが配列内に存在しない場合は、-1 を返します。
たとえば、関数への入力が次の場合を考えてみましょう。
入力
const arr = [1, 2, 3, 4, 3, 2, 1];
出力
const output = 3;
出力の説明
インデックス 3 の左側(1 + 2 + 3 = 6)と右側(3 + 2 + 1 = 6)の要素の合計が、どちらも 6 で等しくなっているためです。
解決策:バランスインデックスを見つけるコード
以下が実際のコードです。
const arr = [1, 2, 3, 4, 3, 2, 1];
const balancingIndex = (arr = []) => {
const findSum = arr => arr.reduce((acc, x) => acc + x, 0);
for(let i = 0; i < arr.length; i++){
const leftSum = findSum(arr.slice(0, i));
const rightSum = findSum(arr.slice(i + 1));
if(leftSum === rightSum){
return i;
};
};
return -1;
};
console.log(balancingIndex(arr));
コードの解説
このコードの仕組みを順番に見ていきましょう。
findSum:reduce()メソッドを使って、配列内のすべての要素の合計を計算するヘルパー関数です。初期値として 0 を渡しているため、空の配列でも安全に動作します。- ループ処理:各インデックス
iについて、slice(0, i)で左側の部分配列を、slice(i + 1)で右側の部分配列を取り出し、それぞれの合計を求めます。 - 判定:左右の合計が一致した時点で、そのインデックスを即座に返します。
- 見つからない場合:ループが最後まで完了しても一致するインデックスが存在しなければ、
-1を返します。
なお、この実装はシンプルで理解しやすい反面、各インデックスごとに slice() と reduce() を呼び出すため、計算量は O(n²) になります。大きな配列を扱う場合は、全体の合計を先に計算しておき、走査しながら左側の合計を累積していく方式にすると O(n) まで高速化できます。
出力
3
-
JavaScriptで配列の任意の位置に要素を挿入する方法(push・unshift・splice)
JavaScriptで配列に要素を追加する場合、挿入する位置によって使い分けられる便利なメソッドが3つあります。 push():配列の末尾に要素を追加する unshift():配列の先頭に要素を追加する splice():配列の任意のインデックス(途中の位置)に要素を挿入する それぞれのメソッドについて、具体的なコード例を見ていきましょう。 1. push() — 配列の末尾に追加する push() メソッドは、引数に渡した要素を配列の最後尾に追加します。複数の要素を一度に渡すことも可能です。 コード例 let arr = [test, 1, 2, hello, 23.5]; arr.pu
-
JavaScriptの基本配列メソッド解説!push・pop・shift・unshift・spliceの使い方を実例付きで紹介
JavaScriptには、配列を操作するための便利な組み込みメソッドが数多く用意されています。その中でも特によく使われるのが、要素の追加や削除を行う以下の5つの基本メソッドです。 JavaScriptの主要な配列メソッド一覧 メソッド説明 Array.push()配列の末尾に要素を追加します。 Array.pop()配列の末尾から要素を取り除きます。 Array.unshift()配列の先頭に要素を追加します。 Array.shift()配列の先頭から要素を取り除きます。 Array.splice()配列内の任意の位置で要素の追加・削除を行います。 これらのメソッドは、配列の