JavaScriptで配列から「合計が指定の数値で割り切れる」ペアを見つける方法
この記事では、数値の配列と1つの数値を受け取り、「2つの要素の合計がその数値で割り切れる」すべてのペアを見つけるJavaScript関数の実装方法を解説します。
問題の定義
関数は第1引数として数値の配列(仮に arr と呼びます)、第2引数として単一の数値(仮に num と呼びます)を受け取ります。
そして、次の条件を満たすすべてのペアを配列から見つけ出します。
(arr[i] + arr[j]) を num で割った余りが 0、かつ i < j
入力例と期待される出力
たとえば、入力として次の配列と数値が与えられた場合を考えます。
const arr = [1, 2, 3, 4, 5, 6]; const num = 4;
この場合の出力は次のようになります。
const output = [ [1, 3], [2, 6], [3, 5] ];
[1, 3] の合計は 4、[2, 6] と [3, 5] の合計は 8 となり、いずれも 4 で割り切れることが確認できます。
実装例
ここでは、二重ループですべてのペアの組み合わせを調べるシンプルなアプローチを採用します。
const arr = [1, 2, 3, 4, 5, 6];
const num = 4;
const divisibleSumPairs = (arr = [], num) => {
const res = [];
const { length } = arr;
for(let i = 0; i < length; i++){
for(let j = i + 1; j < length; j++){
const sum = arr[i] + arr[j];
if(sum % num === 0){
res.push([arr[i], arr[j]]);
}
}
}
return res;
};
console.log(divisibleSumPairs(arr, num));
コードの解説
- 外側のループ変数
iは配列の先頭から順に各要素を走査します。 - 内側のループ変数
jは常にi + 1から開始することで、同一要素の組み合わせや重複ペア([3, 1] と [1, 3] のような逆順ペア)を防いでいます。 - 各ペアの合計を
numで割り、余りが 0 であれば結果配列resに追加します。 - すべてのループが完了した時点で、条件を満たすペアのみが格納された配列を返却します。
なお、この実装の計算量は O(n²) となります。小〜中規模の配列であれば十分なパフォーマンスですが、非常に大きな配列を扱う場合は、剰余ごとに要素を分類するハッシュマップを活用して O(n) へ最適化する方法も検討するとよいでしょう。
出力結果
上記のコードを実行すると、コンソールには次のように出力されます。
[ [ 1, 3 ], [ 2, 6 ], [ 3, 5 ] ]
-
JavaScriptでソートされていない配列から欠落している1つの数字を見つける方法
問題の概要1からnまでの連続した整数が含まれるはずの配列を受け取り、欠落している1つの数字を見つけて返すJavaScript関数を作成します。この配列には次の2つの特徴があります。1つの数字だけが欠落している要素がランダムな順序で格納されている(未ソート)解決のアプローチ:等差数列の和の公式最もシンプルかつ効率的な方法は、ガウスの和の公式を利用することです。1からnまでの整数の合計は「n × (n + 1) ÷ 2」で求めることができます。具体的な手順は以下の通りです。実際の合計:reduce()メソッドを使って、配列内の全要素の合計を計算する理論上の合計:欠落した数字を含む完全な数列の合計を
-
JavaScriptで数字列の中から最大の5桁の連続数字を見つける方法
問題少なくとも5桁以上の数字で構成される文字列を受け取るJavaScript関数を作成する必要があります。この関数は、与えられた数字列の中に含まれる「連続する5桁」の中で最も大きな数値を返さなければなりません。たとえば、入力が 123546544 の場合、取りうる5桁の組み合わせは「12354」「23546」「35465」「54654」「46544」となり、この中で最大のものは 54654 です。解決アプローチ考え方はシンプルです。文字列を先頭から1文字ずつずらしながら、5文字分を切り出す切り出したすべての5桁の部分文字列を配列に格納するMath.max() を使って最大値を求めるJavaSc