JavaScriptで配列内の要素から目標の合計値を持つグループを数える方法
問題の概要
まず、次のような数値の配列を例に考えてみましょう。
const arr = [1, 2, 1, 3, 2];
ここで求められているのは、次の3つの引数を受け取るJavaScript関数です。
- 第1引数:対象となる数値の配列
- 第2引数:目標となる合計値(sum)
- 第3引数:合計値を構成する要素の個数(num)※同じ要素の重複使用は不可
関数は、指定された個数の要素の合計が目標値と一致するグループの総数を返します。
入力例と出力例
入力値が次のとおりだとします。
const arr = [1, 2, 1, 3, 2]; const sum = 3; const num = 2;
この場合、期待される出力は次のとおりです。
const output = 2;
これは、合計が3になる連続する2要素のグループが「[1, 2]」と「[2, 1]」の2つ存在するためです。
サンプルコード
この問題を解くコードは次のとおりです。
const arr = [1, 2, 1, 3, 2];
const sum = 3;
const num = 2;
const findGroups = (arr = [], sum = 1, num = 1) => {
let count = 0
for(let i = 0; i < arr.length; i++){
let part = arr.slice(0 + i, num + i);
const partSum = part.reduce((acc, val) => acc + val);
if(partSum === sum){
count++;
};
};
return count
};
console.log(findGroups(arr, sum, num));
コードの解説
このコードでは、スライディングウィンドウの考え方を利用しています。処理の流れは以下のとおりです。
- 条件を満たすグループの数を記録するため、変数
countを0で初期化します。 forループで配列の先頭から順に走査し、slice()メソッドでnum個分の連続する要素を取り出します。reduce()メソッドで取り出した要素の合計値を計算し、目標のsumと一致するかを判定します。- 一致した場合は
countを1増やします。 - ループ完了後、
countを返り値として返します。
なお、より堅牢な実装にする場合は、条件をif(part.length === num && partSum === sum)のように要素数のチェックも加えると、配列の末尾で要素数が不足するケースを確実に除外できます。
実行結果
コンソールには次のように出力されます。
2
-
JavaScriptで複数の配列から要素を交互に取り出して1つの配列にまとめる方法
問題 今回は、任意の個数の配列を引数として受け取り、それらすべての配列から要素を交互に(順番に一つずつ)取り出して、新しい配列を組み立てるJavaScript関数を作成します。 例えば、関数への入力が次のような場合を考えてみましょう。 入力 const arr1 = [1, 2, 3, 4]; const arr2 = [11, 12, 13, 14]; const arr3 = [a, b, c]; 出力 const output = [1, 11, a, 2, 12, b, 3, 13, c, 4, 14]; ご覧のとおり、まず各配列の先頭要素(1、11、a)、次に各配列の2番目の要素(
-
JavaScriptで配列内の特定の数値に最も近い2つの要素を検索する方法
問題の概要JavaScriptで、ソート済みの整数配列 arr を第一引数に、目標となる数値 target を第二引数に受け取る関数を作成します。この関数は、配列内に存在する要素の中から target に最も近い2つの数値を選び、それらを昇順に並べた配列として返す必要があります。例えば、以下のような入力が与えられた場合を考えてみましょう。入力:const arr = [1, 2, 3, 4, 5];const target = 3;出力:const output = [2, 3];この場合、target の値が 3 であるため、最も近い2つの要素は 2 と 3 となり、昇順に並べて [2, 3