JavaScriptで隣接要素の差に基づいてソート済み配列をグループ化する方法
以下のように、昇順に並べ替えられた整数の配列があると仮定します。
const arr = [ 1, 2, 3, 5, 6, 7, 10, 12, 17, 18];
このような配列を受け取るJavaScript関数を作成する必要があります。この関数は、次の条件を満たすように配列をグループ化しなければなりません。
同じグループ内の要素どうしの差は1以下であること
有効なグループとみなされるためには、各グループが2つ以上の要素を含んでいること
上記の条件に基づくと、期待される出力は次のようになります。
const output = [ [1, 2, 3], [5, 6, 7], [17, 18] ];
実装例
この処理を実現するコードは次のとおりです。
const arr = [ 1, 2, 3, 5, 6, 7, 10, 12, 17, 18];
const groupNear = (arr = []) => {
const res = [];
for (let ind = 0; ind < arr.length; ind++) {
let value = arr[ind];
if (arr[ind - 1] + 1 === value) {
res[res.length - 1].push(value);
} else if (value + 1 === arr[ind + 1]) {
res.push([value]);
};
};
return res;
};
console.log(groupNear(arr));出力結果
コンソールには次のように表示されます。
[ [ 1, 2, 3 ], [ 5, 6, 7 ], [ 17, 18 ] ]
コードの解説
この関数では、forループを使って配列の各要素を先頭から順に走査しています。注目しているのは「前の要素」と「次の要素」それぞれとの関係です。
まず、現在の要素が直前の要素と連続している(直前の要素+1と一致する)場合、その要素は既存の連続グループの続きとみなせるため、結果配列の最後のグループに追加されます。
一方、直前の要素とは連続していないものの、次の要素と連続している場合(現在の要素+1が次の要素と一致する場合)は、そこが新しい連続グループの始まりとなるため、新しいグループを作成してその値を格納します。
この判定をすべての要素に対して繰り返すことで、「隣接する要素どうしの差が1である要素」だけで構成されたグループのみが残り、単独の要素(たとえば例の10や12など、前後どちらとも連続しない要素)は自動的に除外されます。計算量はO(n)と配列の長さに比例して済むため、大きなデータセットでも効率的に動作します。
-
JavaScriptにおける関数とメソッドの違いとは?わかりやすく解説
JavaScriptにおいて、関数とメソッドは本質的には同じものです。両者の違いは、メソッドがオブジェクトのプロパティとして定義された関数であるという点にあります。つまり、独立して定義されたものを「関数」、オブジェクトに紐づけられたものを「メソッド」と呼びます。 JavaScriptの関数の基本形 まず、一般的な関数の定義方法を見てみましょう。 function functionname(param1, param2){ // 処理内容 } JavaScriptのメソッドの例 メソッドは、オブジェクトに関連付けられた関数です。次の例では、employeeオブジェクトの中にdetails
-
C言語で解く:k個の要素のグループと配列の残りとの最大差を求めるアルゴリズム
問題概要サイズNの整数配列と数値kが与えられます。配列はランダムな順序の整数で構成されており、ここからk個の要素を取り出して「グループ」を作り、残りのN−k個の要素をもう一方のグループとします。求めたいのは、両グループの要素の合計値の差が最大になるようにk個の要素を選んだときの、その最大差です。考え方この問題のポイントは、kの大きさによって最適な選び方が変わることです。kが小さい場合(配列サイズの半分以下):最小のk個の要素を選べば合計が最小になり、残りのN−k個の要素は自然と大きな合計になります。したがって、最大差は「残りのN−k個の合計 − 最小k個の合計」で求められます。kが大きい場合(