JavaScriptで配列内の最長連続繰り返し数列を見つけてその長さを返す方法
本記事では、重複する要素を含む可能性のある数値の配列を受け取り、その中で最も長く連続して繰り返されている数値シーケンスの長さを返すJavaScript関数を作成します。
例として、次のような入力配列が与えられたとします。
const arr = [2, 1, 1, 2, 3, 3, 2, 2, 2, 1];
この場合、期待される出力は 3 です。これは、数値「2」が配列の末尾近くで3回連続して現れており、これが配列全体の中で最も長い連続繰り返しとなっているためです。
実装アプローチ
ここでは、reduce() メソッドを2段階に分けて活用します。
ステップ1:連続する同じ数値をグループ化
最初の reduce() では、隣接する要素が同じ値であれば既存のグループに追加し、異なる値であれば新しいグループを作成することで、連続する数値ごとのサブ配列を生成します。
ステップ2:最も長いグループを抽出
2つ目の reduce() では、生成された各グループの長さを比較し、最も長いものを選び出します。最後にその長さを返すことで、答えが得られます。
サンプルコード
const arr = [2, 1, 1, 2, 3, 3, 2, 2, 2, 1];
const findLongestSequence = (arr = []) => {
const res = arr.reduce((acc,val,ind) => {
if(acc.length && acc[acc.length-1][0] === val){
acc[acc.length-1].push(val);
}else{
acc.push([val]);
};
return acc;
},[]).reduce((acc, val) => {
return val.length > acc.length ? val : acc;
});
return res.length;
}
console.log(findLongestSequence(arr));出力結果
上記のコードを実行すると、コンソールには以下のように出力されます。
3
処理の流れを確認
ステップ1のグループ化を行うと、入力配列は次のようなサブ配列の集合に変換されます。
[[2], [1, 1], [2], [3, 3], [2, 2, 2], [1]]
この中で最も長いのは [2, 2, 2] の長さ3であるため、関数は 3 を返すという仕組みです。この手法により、ループやカウンター変数を明示的に書かずに、宣言的で読みやすいコードとして問題を解決できます。
-
JavaScriptで配列の要素を同じ配列内に複製する方法
JavaScriptでは、concat()メソッドとsort()メソッドを組み合わせることで、既存の配列の要素を同じ配列内に複製することができます。ここでは、実際に動作するサンプルコードを使って、その手順をわかりやすく解説します。 コード例 以下は、配列の要素を同じ配列内に複製するためのコード例です。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" cont
-
JavaScriptで配列のネストされた集合の最長の長さを見つけて返す方法
問題数値の配列 arr を第一引数(かつ唯一の引数)として受け取るJavaScript関数を作成する必要があります。長さ N の配列 arr には、0 から N-1 までのすべての整数がちょうど1回ずつ含まれています。この関数では、次のルールに従って構成される集合 S の最長の長さを見つけ、その結果を返す必要があります。ここで、S[i] = {A[i], A[A[i]], A[A[A[i]]], ...} と定義されます。具体的には、S の最初の要素としてインデックス i の要素 A[i] を選択することから始め、次の要素は A[A[i]]、その次は A[A[A[i]]]… というように順に辿