JavaScriptで1つの要素を除いた配列の合計(最小値・最大値)を求める方法
問題の概要
次のような整数の配列があるとします。
const arr = [12, 1, 4, 8, 5];
ここで求められているのは、このような配列を唯一の引数として受け取るJavaScript関数の作成です。
この関数は、正確に2つの整数からなる配列を返す必要があります。
1つ目の整数: 配列の要素から任意の1つを除外した場合に得られる最小の合計
2つ目の整数: 配列の要素から任意の1つを除外した場合に得られる最大の合計
さらに重要な条件として、処理には forループを1回だけ 使用しなければなりません。
期待される出力
たとえば、上記の配列の場合、出力は次のようになります。
const output = [18, 29];
最小の合計「18」は 12 を除外した場合、最大の合計「29」は 1 を除外した場合に得られるためです。
解決のポイント
この問題を1回のループで解く鍵は、以下の性質を利用することです。
- 全体の合計から最大値を引くと、最小の合計になる
- 全体の合計から最小値を引くと、最大の合計になる
そのため、ループの中で「合計」「最大値」「最小値」の3つを同時に追跡すれば、ループは1回で済みます。
コード例
実際のコードは以下のようになります。
const arr = [12, 1, 4, 8, 5];
const findExtremeNumbers = (arr = []) => {
let sum = 0;
let min = Infinity;
let max = -Infinity;
for(let i = 0; i < arr.length; i++){
const curr = arr[i];
sum += curr;
if(curr > max){
max = curr;
}
if(curr < min){
min = curr;
};
};
return [sum - max, sum - min];
};
console.log(findExtremeNumbers(arr));コードの解説
sum: ループ中で全要素の合計を累積していきます。min: それまでに見つかった最小値を保持します(初期値はInfinity)。max: それまでに見つかった最大値を保持します(初期値は-Infinity)。
ループ完了後、sum - max が最小の合計、sum - min が最大の合計となり、これらを配列として返します。計算量は O(n) で、ループは配列を一度走査するだけなので、条件を満たしています。
出力結果
コンソールに出力される結果は次のとおりです。
[18, 29]
-
JavaScriptで配列の最初の要素と最後の要素を取得する方法
配列とは、複数の要素をひとまとめにして管理するデータ構造です。各要素にはそれぞれ固有のインデックス番号が割り当てられており、このインデックスを使うことで任意の要素へアクセスできます。ただし、最後の要素に関しては、配列に含まれる要素数が分からなければインデックスも確定しないため、少し工夫が必要です。本記事では、これらの方法をわかりやすく解説します。 最初の要素へのアクセス JavaScriptでは配列のインデックスは「0」から始まるため、最初の要素の位置は常に分かっています。そのため、値の取得は非常に簡単です。配列を arr とすると、最初の要素の値は arr[0] で表されます。 サンプ
-
JavaScriptで配列の最後の要素を取得・表示する方法
配列の最後の要素を取得して画面に表示するには、pop()メソッドを利用するのが手軽です。以下に、ボタンをクリックすると配列の最後の要素を表示するサンプルコードを示します。 コード例 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> &