左右の部分配列の合計の積を求めるJavaScript関数
本記事では、長さN(Nは偶数)の数値配列を受け取り、その配列を左右2つの部分配列に分割して処理するJavaScript関数の実装方法を解説します。
問題の概要
要件は以下のとおりです。
- 長さNの数値配列を受け取る(Nは偶数であること)
- 配列を前半N/2個の要素からなる「左側」の部分配列と、後半N/2個の要素からなる「右側」の部分配列に分割する
- それぞれの部分配列の要素の合計を求める
- 両方の合計値を乗算した結果を返す
例えば、入力配列が次の場合を考えてみましょう。
const arr = [1, 2, 3, 4]
この場合、左側は [1, 2]、右側は [3, 4] となるため、出力は以下のようになります。
(1 + 2) * (3 + 4) = 3 * 7 = 21
実装コード
以下が実際のコード例です。ここでは reduce() メソッドを使い、1回のループで左右の合計を同時に計算しています。
const arr = [1, 2, 3, 4]
const subArrayProduct = arr => {
const { length: l } = arr;
const creds = arr.reduce((acc, val, ind) => {
let { left, right } = acc;
if(ind < l/2){
left += val;
}else{
right += val;
}
return { left, right };
}, {
left: 0,
right: 0
});
return creds.left * creds.right;
};
console.log(subArrayProduct(arr));
コードのポイント
reduce()の初期値として{ left: 0, right: 0 }を設定し、アキュムレータ内で両方の合計を管理します。- 現在のインデックス
indが配列長の半分未満であれば左側の合計に加算し、そうでなければ右側の合計に加算します。 - 最後に
creds.left * creds.rightで両方の合計を乗算して返すことで、余分なループや中間配列を作らずに済みます。
出力結果
コンソールには次のように出力されます。
21
-
JavaScriptで循環配列の最大部分配列和を求める方法
問題JavaScriptで、整数の配列 arr を唯一の引数として受け取る関数を作成します。この配列 arr は循環配列として扱います。循環配列とは、配列の末尾の要素の後に先頭の要素が続く構造のことです。私たちのタスクは、arr の空でない部分配列の中から、要素の合計が最大となる値を見つけて返すことです。入出力の例入力:const arr = [2, -2, 3, -1];出力:const output = 4;出力の説明:この場合、最適な部分配列は [3, -1, 2] です。末尾の -1 の後に先頭の 2 が続くため、3 + (-1) + 2 = 4 となり、これが最大の合計値になります。
-
JavaScriptで積がターゲット未満となる部分配列の個数を数える方法
問題数値の配列 arr を第1引数に、数値 target を第2引数として受け取るJavaScript関数を作成する必要があります。この関数は、部分配列に含まれるすべての要素の積が target よりも小さくなる「連続した」部分配列の個数を数えて返すものです。たとえば、関数への入力が次の場合を考えてみましょう。入力const arr = [10, 5, 2, 6]; const target = 100;出力const output = 8;出力の説明積が100未満となる8つの部分配列は次のとおりです。[10], [5], [2], [6], [10, 5], [5, 2], [2, 6],