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 となります。
この関数は、次の条件を満たす2つの数値からなる配列 [A, B] を見つけて返す必要があります −
A2 + B2 = num
例えば、入力配列が次の場合 −
[1, 2, 3, 4]
まず num を計算すると、num = (1 + 4) × (9 + 16) = 125 となります。
したがって、期待される出力は −
[2, 11]
これは、22 + 112 = 4 + 121 = 125 が成立するためです。
解法のアプローチ
この問題は、次の2段階の処理で解くことができます。
ステップ1: num の計算
配列を先頭から2つずつのペアに分け、各ペアについて (a² + b²) を計算し、それらを順に掛け合わせます。この構造は複素数の積に関連しています。ブラーマグプタ=フィボナッチ恒等式によれば、(a² + b²)(c² + d²) は必ず2つの整数の平方和の形で表せるため、答えが存在することが保証されます。
ステップ2: 平方和への分解
求めた num に対して、k² + j² = num を満たす非負の整数 k と j を二重ループによる総当たりで探索します。条件が一致した時点で [k, j] を返します。
例
以下が実際のコードです −
const arr = [1, 2, 3, 4];
const findMatchingSumArray = (arr = []) => {
let squaredSum = 1;
for(let i = 0; i < arr.length - 1; i += 2){
const curr = arr[i];
const next = arr[i + 1];
squaredSum *= (Math.pow(curr, 2) + Math.pow(next, 2));
};
for(let k = 0; k * k < squaredSum; k++){
for(let j = 0; (k * k) + (j * j) <= squaredSum; j++){
if((k * k) + (j * j) === squaredSum){
return [k, j];
};
};
};
return [];
};
console.log(findMatchingSumArray(arr));
出力
コンソールには次の出力が表示されます −
[2, 11]
-
JavaScriptで数値の配列をアルファベットの文字列に変換する方法
問題数値の配列を引数として受け取るJavaScript関数を作成する必要があります。この関数は、ハイフン(-)で区切られた次の4つの部分から成る1つの文字列を返さなければなりません。配列の先頭2つと末尾2つの数値から導かれる4文字の「単語」。並び順は左から右に読む順(先頭、2番目、末尾から2番目、末尾)とする。同じ処理を、配列を昇順にソートした後に行ったもの。同じ処理を、配列を降順にソートした後に行ったもの。同じ処理を、配列をASCII文字に変換してアルファベット順にソートした後に行ったもの。この4つの部分をつなぎ合わせて1つの文字列とし、各部分の間はハイフン(-)で区切ります。コード例以下が
-
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