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

【JavaScript】連続する配列要素の合計で新しい配列を作成する方法

問題の概要

JavaScriptで、第1引数として数値の配列 arr を、第2引数として整数 num(num は配列の長さ以下)を受け取る関数を作成する必要があります。

この関数は、元の配列 arr 内にある長さ num の連続する部分配列(スライディングウィンドウ)ごとに合計を計算し、その結果を新しい配列の要素として返します。

入力例

const arr = [1, 2, 3, 4, 5, 6];
const num = 2;

期待される出力

const output = [3, 5, 7, 9, 11];

出力の解説

隣り合う2つの要素を順番に足し合わせています。

  • 1 + 2 = 3
  • 2 + 3 = 5
  • 3 + 4 = 7
  • 4 + 5 = 9
  • 5 + 6 = 11

そのため、結果は [3, 5, 7, 9, 11] となります。出力配列の長さは、元の配列の長さから num - 1 を引いた値になります。

実装コード

以下が実際のコードです。効率化のため、スライディングウィンドウ(尺取り法) の考え方を使っています。ウィンドウが1つずれるたびに、左端の要素を引き、右端の新しい要素を足すだけで済むため、毎回全要素を再計算する必要がありません。

const arr = [1, 2, 3, 4, 5, 6];
const num = 2;

const accumulateArray = (arr = [], num = 1) => {
    const res = [];
    let sum = 0, right = 0, left = 0;

    // 最初のウィンドウ(num個分)の合計を計算
    for (; right < num; right++) {
        sum += arr[right];
    }
    res.push(sum);

    // ウィンドウを右にずらしながら合計を更新
    while (right < arr.length) {
        sum -= arr[left];  // 左端の要素を除外
        sum += arr[right]; // 右側の新しい要素を追加
        right++;
        left++;
        res.push(sum);
    };

    return res;
};

console.log(accumulateArray(arr, num));

実行結果

コンソールには以下のように出力されます。

[3, 5, 7, 9, 11]

処理のポイント

  • 初期化フェーズ: まず最初の num 個の要素の合計を計算し、結果配列に追加します。
  • 更新フェーズ: ポインタ rightleft を同時に進めながら、「前の合計 − 左端の要素 + 新しい右端の要素」で次の合計を求めます。
  • 計算量: 各要素は一度だけ加算・減算されるため、時間計算量は O(n)、空間計算量も O(n) と非常に効率的です。

この手法は、移動平均の計算や一定範囲の統計値を求める場面など、さまざまな実務シーンでも応用できるテクニックです。

  1. JavaScriptでnewキーワードを使って配列を作成する方法

    JavaScriptでは、newキーワードとArray()コンストラクタを使用することで、簡単に配列を作成できます。本記事では、実際に動作するサンプルコードとともに、その基本的な使い方を解説します。 サンプルコード 以下は、newキーワードを使用してJavaScriptの配列を作成するコード例です。 <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport content=width=device-width, initial-sca

  2. JavaScriptでオブジェクトを新しい配列に変換する方法

    JavaScriptでは、オブジェクトのプロパティやネストされたデータを取り出し、扱いやすい形で新しい配列にフォーマットできます。本記事では、学校(school)オブジェクトに含まれる生徒情報を、文字列形式の配列へ変換する実践的なコード例を紹介します。 ポイントとなるテクニック このサンプルでは、以下の2つのJavaScript機能を活用しています。 分割代入(Destructuring assignment):オブジェクトから特定のプロパティを簡潔に取り出す構文です。 for...of ループ:配列内の各要素を順番に処理するために使用します。 コード例 <!DOCTYPE html