JavaScriptで最大三重積配列を求める方法|コード例付きでわかりやすく解説
問題の概要
整数の配列を唯一の引数として受け取るJavaScript関数を実装する必要があります。
入力配列をもとに、以下の条件に従って同じ長さの新しい配列を構築します。
- 出力配列の各要素は、その位置までに出現した「最大の3つの数値」の積となる
- インデックスが3未満の場合(まだ3つの要素が出現していない場合)は -1 を返す
- 積の計算には同じ値を再利用できるが、それぞれ異なるインデックスに存在する要素である必要がある
入力例と出力例
たとえば、入力配列が以下の場合を考えてみましょう。
const arr = [1, 2, 3, 4, 5, 6];期待される出力は次のとおりです。
const output = [-1, -1, 6, 24, 60, 120];この結果は以下のように解釈できます。
- インデックス 0・1 → まだ3つの要素がそろっていないため -1
- インデックス 2 → 1 × 2 × 3 = 6
- インデックス 3 → 2 × 3 × 4 = 24
- インデックス 4 → 3 × 4 × 5 = 60
- インデックス 5 → 4 × 5 × 6 = 120
実装コード
以下が実際のコードです。
const arr = [1, 2, 3, 4, 5, 6];
const maximumTripleProduct = (arr = []) => {
const res = [];
const max = [arr[0], arr[1], arr[2]];
res[0] = res[1] = -1;
res[2] = arr[0] * arr[1] * arr[2];
for(let i = 3; i < arr.length; i++){
max.push(arr[i]);
max.sort((a, b) => b - a);
max.pop();
res[i] = max[0] * max[1] * max[2];
};
return res;
};
console.log(maximumTripleProduct(arr));コードの解説
このアルゴリズムのポイントは、常に「上位3つの最大値」だけを保持する配列 max を維持することです。
- 初期状態として、配列の最初の3要素を
maxに格納し、結果配列の先頭2要素には -1 を設定します。 - インデックス2以降のループ処理では、新しい要素を
pushでmaxに追加します。 - 降順にソートした後、最小の要素(4番目に入った値)を
popで削除することで、常に最大3要素のみを保持します。 - 残った3要素の積を計算し、結果配列の対応する位置に格納します。
ソート対象の配列サイズは常に4以下であるため、要素数が増えてもパフォーマンスが大きく劣化せず、全体の計算量はほぼ O(n) の効率で動作します。
出力結果
上記コードをコンソールで実行すると、以下の出力が得られます。
[-1, -1, 6, 24, 60, 120]まとめ
本記事では、配列を走査しながら「それまでに出現した最大3つの数値の積」を効率的に求める方法を解説しました。上位k個の最大値を維持しながら配列を処理するこのテクニックは、ストリーミングデータの処理やスライディングウィンドウ的な問題にも応用できる、覚えておくと便利なアルゴリズムパターンです。
-
JavaScriptで数字列の中から最大の5桁の連続数字を見つける方法
問題少なくとも5桁以上の数字で構成される文字列を受け取るJavaScript関数を作成する必要があります。この関数は、与えられた数字列の中に含まれる「連続する5桁」の中で最も大きな数値を返さなければなりません。たとえば、入力が 123546544 の場合、取りうる5桁の組み合わせは「12354」「23546」「35465」「54654」「46544」となり、この中で最大のものは 54654 です。解決アプローチ考え方はシンプルです。文字列を先頭から1文字ずつずらしながら、5文字分を切り出す切り出したすべての5桁の部分文字列を配列に格納するMath.max() を使って最大値を求めるJavaSc
-
JavaScriptで配列内の唯一の異なる文字列を見つける方法
問題 文字列の配列を受け取るJavaScript関数を作成する必要があります。配列内のすべての文字列は同じ文字(またはその並べ替え)で構成されていますが、ただ1つの文字列だけが異なる文字セットを含んでいます。この関数の目的は、その唯一の文字列を見つけ出して返すことです。 例: 次のような配列が与えられたとします。 [ba, abc, acb, bac, foo, bca, cab, cba] この場合、求めるべき文字列は「foo」です。 文字列には空白が含まれることがありますが、空白自体は意味を持たず、空白以外の記号のみが判定の対象となります。たとえば、空白だけで構成された文字列は空文字列と