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

JavaScriptでエレベータが移動した階数の合計を求める方法


問題

ある時間帯において、建物のエレベータが停止した階数を要素として持つ配列を受け取り、その間にエレベータが移動した階数の合計を返すJavaScript関数を作成する必要があります。

解決のアプローチ

この問題は、配列内の隣り合う2つの階数の差の絶対値を順番に足し合わせることで解決できます。例えば、7階から1階へ移動すれば6階分、1階から7階へ戻ればさらに6階分とカウントしていきます。最終的に、これらの差をすべて合計した値が、エレベータがカバーした総階数となります。

コード例

以下がその実装コードです。

const arr = [7, 1, 7, 1];
const floorsCovered = (arr = []) => {
   let res = 0;
   for (let i = 0; i < arr.length; i++){
      if (arr[i] > arr[i+1]){
         res += arr[i] - arr[i+1];
      };
      if (arr[i] < arr[i+1]){
         res += arr[i+1] - arr[i];
      }
   };
   return res;
};
console.log(floorsCovered(arr));

出力結果

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

18

処理の流れの解説

入力配列 [7, 1, 7, 1] の場合、各移動の階数差は以下のように計算されます。

  • 7階 → 1階:|7 − 1| = 6
  • 1階 → 7階:|1 − 7| = 6
  • 7階 → 1階:|7 − 1| = 6

合計は 6 + 6 + 6 = 18 となり、関数は正しく18を返します。

なお、ループの最後では arr[i+1]undefined になりますが、数値との大小比較はどちらも false を返すため、加算処理が行われず安全に動作します。より堅牢にしたい場合は、Math.abs(arr[i+1] - arr[i]) を使って条件分岐をまとめたり、ループ範囲を arr.length - 1 までに限定する方法も有効です。


  1. JavaScriptで合計が0以上となる最長部分配列を見つけるアルゴリズム

    問題の概要今回は、-1から1の範囲の整数のみを含む配列を受け取り、その中から合計が0以上になる最長の連続する部分配列(サブアレイ)の長さを返すJavaScript関数を作成します。一見単純な問題に見えますが、全ての組み合わせを総当たりで調べると計算量がO(n²)となり、配列が大きくなると非効率です。そこで本記事では、累積和(プレフィックスサム)の考え方を活用し、線形時間O(n)で解くスマートな手法を紹介します。解法のコードconst arr = [-1, -1, 0, 1, 1, -1, -1, -1]; const longestPositiveSum = (arr = []) =>

  2. JavaScriptで括弧文字列のスコアを計算する方法

    問題の概要バランスの取れた角括弧([ と ])のみで構成された文字列 str を引数として受け取り、そのスコアを計算して返すJavaScript関数を作成する必要があります。スコアの計算は、以下のルールに従います。[] のスコアは 12つのバランスの取れた括弧文字列 A と B を連結した AB のスコアは A + Bバランスの取れた括弧文字列 A を囲んだ [A] のスコアは 2 × A入出力例例えば、関数への入力が次の場合:入力const str = [][];出力const output = 2;この場合、[] が2つ並んでいるため、スコアは 1 + 1 = 2 となります。解決アプロー