JavaScriptで配列を「1つの要素」と「残りの積」に等しく分割できるか判定する方法
問題の概要
今回は、次のような条件を満たすかどうかを判定する関数をJavaScriptで作成します。配列を「1つの要素」と「それ以外の要素」に分割したとき、その1つの要素の値が、自分自身を除く他のすべての要素の積と一致する場合は true を返し、一致しない場合は false を返します。
具体例
たとえば、次のような配列が与えられたとします。
const arr = [1, 56, 2, 4, 7];
この場合の出力は true になります。なぜなら、最大値である 56 は、それ以外の要素の積と等しいからです。
2 * 4 * 7 * 1 = 56
実装のアイデア
この問題は、配列全体を一度だけ走査すれば解決できます。reduce() メソッドを使い、走査しながら次の2つの値を追跡します。
- max:これまでに見つかった最大の要素
- prod:最大値以外の要素すべての積
新しい要素が現在の最大値より大きければ、それまでの最大値を積に掛けてから最大値を更新し、そうでなければ単純に積にその要素を掛けます。最後に、最大値と積が一致するかどうかを比較すれば判定は完了です。
サンプルコード
以下が実際のコードです。
const arr = [1, 56, 2, 4, 7];
const isEqualPartition = arr => {
const creds = arr.reduce((acc, val) => {
let { prod, max } = acc;
if(val > max || !max){
prod *= (max || 1);
max = val;
}else{
prod *= val;
}
return { prod, max };
}, {
prod: 1,
max: null
});
return creds.max === creds.prod;
};
console.log(isEqualPartition(arr));出力結果
コンソールには次のように表示されます。
true
処理のポイント
初期状態では max が null のため、最初の要素は必ず最大値として扱われます。また (max || 1) によって、最大値がまだ確定していない段階では積に影響を与えないようにしています。
このアルゴリズムの計算量は O(n) であり、配列を一度走査するだけで済むため、大きなデータセットに対しても効率的に動作します。ただし、0や負の数が含まれる配列では意図しない結果になる可能性があるため、使用する際は入力データの性質に注意してください。
-
JavaScriptで数値の配列に対してべき乗演算を実行する方法
問題 私たちは、偶数の長さを持つ整数の配列 arr を引数として受け取る JavaScript 関数を記述する必要があります。 ここで、次のような数値 num を考えます − num = (arr[0] * arr[0] + arr[1] * arr[1]) * (arr[2] * arr[2] + arr[3] * arr[3]) * … * (arr[n-2] * arr[n-2] + arr[n-1] * arr[n-1]) このとき n は配列の長さを表します。つまり、配列を隣り合う2つの要素ごとのペアに分割し、各ペアの平方和をすべて掛け合わせた値が num となります。 この関数は
-
JavaScriptで数値配列の分散を計算する方法
問題昇順にソートされた数値の配列を受け取り、その分散(Variance)を計算するJavaScript関数を作成する必要があります。分散とは、一連の数値が平均値からどれだけばらついているかを表す統計量で、まず平均値を求め、その平均との差の二乗和をデータ数で割ることで計算できます。計算式まず、平均値(M)は次のように定義されます。$Mean (M) = ( \sum_{i=0}^{n-1} arr[i])$ / n続いて、分散(V)は各要素と平均値の差を二乗し、それらを合計してデータ数で割った値になります。Variance (V) = $(\sum_{i=0}^{n-1} (arr[i] - M