【JavaScript】配列内のすべての奇数長部分配列の合計を求める方法
今回は、数値の配列を唯一の引数として受け取るJavaScript関数を作成します。
この関数の役割は、元の配列から取り得るすべての奇数長の部分配列を抽出し、それぞれの合計値を計算した上で、その総和を返すことです。
部分配列とは何か
ここでの「部分配列(サブ配列)」とは、配列から任意の要素を組み合わせたものではなく、連続した要素からなる連続部分列を指す点に注意してください。
具体例で確認する
例えば、次のような入力配列が与えられたとします。
const arr = [1, 2, 3, 4, 5];
この場合、考えられるすべての奇数長の部分配列は以下の通りです。
[1], [2], [3], [4], [5], [1, 2, 3], [2, 3, 4], [3, 4, 5], [1, 2, 3, 4, 5]
これらの合計を計算すると、期待される出力は次のようになります。
const output = 57;
実装コード
それでは、実際のコードを見てみましょう。まず、配列の合計を求めるヘルパー関数を用意し、長さが奇数である部分配列を順に切り出しながら合計を加算していきます。
const arr = [1, 2, 3, 4, 5];
// 配列の合計を求める関数
const sumArray = (arr = []) => arr.reduce((a, b) => a + b);
// すべての奇数長部分配列の合計を求める関数
const oddSum = (arr = []) => {
let len = 1; // 部分配列の長さ(奇数のみ)
let sum = 0;
const { length } = arr;
while (len <= length) {
for (let i = 0; i + len <= length; i++) {
sum += sumArray(arr.slice(i, i + len));
};
len += 2; // 長さを2ずつ増やして奇数を維持
};
return sum;
};
console.log(oddSum(arr));コードの解説
このアルゴリズムの流れは以下の通りです。
1. 変数 len を1で初期化し、部分配列の長さとして扱います。
2. 外側の while ループで、長さが配列全体の長さ以下である限り処理を繰り返します。
3. 内側の for ループでは、開始位置 i を先頭から順に移動させながら、slice(i, i + len) で長さ len の部分配列を切り出します。
4. 切り出した部分配列の合計を sumArray 関数で計算し、変数 sum に加算していきます。
5. 一周終わったら len += 2 とすることで、次に処理する部分配列の長さも奇数に保ちます。
出力結果
このコードを実行すると、コンソールには次の出力が表示されます。
57
このように、単純な二重ループと slice()、reduce() を組み合わせるだけで、すべての奇数長部分配列の合計を簡単に求めることができます。
-
JavaScript配列から一意の値(重複なし)を取得する方法
JavaScriptの配列に含まれる重複した値を取り除き、一意の値(ユニークな値)だけを取得したい場合は、Setオブジェクトを使うのが最もシンプルで効率的な方法です。 Setは同じ値を1つしか格納できないデータ構造のため、配列をnew Set()に渡すだけで自動的に重複が排除されます。その後、スプレッド構文([...set])を使えば、簡単に元の配列形式へ戻すことができます。 サンプルコード 以下は、JavaScriptの配列からすべての一意の値を取得する実際のコード例です。 <!DOCTYPE html> <html lang=ja> <head> <
-
Pythonで配列内のすべての奇数長部分配列の合計を求める方法を解説
正の整数からなる配列 nums が与えられたとき、考えられるすべての奇数長の部分配列(サブ配列)の要素の合計を求めます。なお、部分配列とは元の配列から連続して取り出された部分列のことを指します。 具体例で確認する 例として、nums = [3, 8, 2, 5, 7] が入力された場合を考えてみましょう。このときの出力は 92 になります。対象となる奇数長の部分配列は以下の通りです。 nums[0] = 3 nums[1] = 8 nums[2] = 2 nums[3] = 5 nums[4] = 7 nums[0..2] → 合計 = 13 nums[1..3] → 合計 = 15 nu