JavaScriptでシャーロック配列の問題を解く方法|左右の合計が等しい要素を見つける
ワトソンはシャーロックに長さNの配列Aを渡します。そして、「その配列の中に、ある要素を基準としたとき左側の要素の合計と右側の要素の合計が等しくなるような要素が存在するかどうか」を判定するよう求めます。
今回はこの問題をJavaScriptの関数として実装します。関数は数値の配列を受け取り、条件を満たす要素が存在すればそのインデックスを返し、存在しない場合は-1を返します。
アルゴリズムの考え方
この問題を効率よく解くカギとなるのは、配列全体の合計値を先に計算しておくことです。あとは配列を先頭から順に走査しながら、次の手順を繰り返します。
- 合計値から現在の要素を引く → 残った値が右側の合計になる
- その値とこれまでの左側の合計(leftSum)を比較する
- 両者が一致すれば、そのインデックスを返す
- 一致しなければ、現在の要素をleftSumに加算して次の要素へ進む
この方法なら配列を一度だけ走査すればよいため、時間計算量はO(N)と非常に効率的です。
コード例
const arr = [1, 2, 3, 4, 5, 7, 3];
const arr2 = [4, 6, 3, 4, 5, 2, 1];
const isSherlockArray = arr => {
let sum = arr.reduce((acc, val) => acc + val);
let leftSum = 0;
for(let i = 0; i < arr.length; i++){
sum -= arr[i];
if(sum === leftSum){
return i;
};
leftSum += arr[i];
};
return -1;
};
console.log(isSherlockArray(arr));
console.log(isSherlockArray(arr2));
出力結果
コンソールには次のように表示されます。
4 -1
動作の解説
例1:[1, 2, 3, 4, 5, 7, 3] の場合、インデックス4(値は5)の位置で、左側の合計(1+2+3+4=10)と右側の合計(7+3=10)が一致するため、4が返されます。
例2:[4, 6, 3, 4, 5, 2, 1] の場合、どの要素を基準にしても左右の合計が一致しないため、-1が返されます。
-
JavaScriptで配列の偶数を2乗・奇数を平方根に変換して合計を求める方法
問題 数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、配列内の各数値に対して「偶数であれば2乗」「奇数であれば平方根」を求め、それらすべての合計を小数点以下2桁に丸めて返します。 解決のアプローチ この問題は、Array.prototype.map()とArray.prototype.reduce()を組み合わせると簡潔に実装できます。まずmap()で各要素を変換した新しい配列を作り、続いてreduce()でその配列の合計を計算します。最後にMath.round()を使って小数点以下2桁に丸めます。 コード例 以下が実際のコードです − const arr
-
JavaScriptで配列を降順に並べ替えて隣接要素の差の合計を求める方法
問題 整数の配列を受け取るJavaScript関数を作成する必要があります。この関数は、配列を降順に並べ替えたうえで、隣り合う要素同士の差を順番に足し合わせ、その合計値を返すものです。 たとえば、次のような配列が渡された場合を考えてみましょう。 [6, 2, 15] この場合、期待される出力は次のとおりです。 (15 - 6) + (6 - 2) = 13 解決のアプローチ この問題は、以下の手順でシンプルに解くことができます。 sort()メソッドを使い、配列を降順(大きい順)に並べ替える。 隣接する2つの要素(i番目と i + 1 番目)の差を計算し、合計に加算していく。 配列の要素