配列内に同一の要素が3つ連続しているかどうかをJavaScriptで判定する方法
本記事では、配列を引数として受け取り、配列内のどこかに同じ値を持つ3つの連続した要素が存在する場合には true を、存在しない場合には false を返すJavaScript関数 checkThree() を作成します。
実装コード
以下の例では、直前の要素とその連続回数を記録しながら配列を先頭から順に走査し、同じ値が3回連続した時点で true を返しています。
const arr = ['g', 'z', 'z', 'v', 'b', 'b', 'b'];
const checkThree = arr => {
// 直前の要素と連続回数を保持するオブジェクト
const prev = {
element: null,
count: 0
};
for (let i = 0; i < arr.length; i++) {
const { count, element } = prev;
// 同じ要素が3回連続した時点でtrueを返す
if (count === 2 && element === arr[i]) {
return true;
}
// 前の要素と同じならカウントを増やし、異なれば1にリセット
prev.count = element === arr[i] ? count + 1 : 1;
prev.element = arr[i];
}
return false;
};
console.log(checkThree(arr));
console.log(checkThree(['z', 'g', 'z', 'z']));
出力結果
コンソールには次のように表示されます。
true false
最初の配列には 'b' が3つ連続して含まれているため true となり、2番目の配列には同一の要素が3つ連続して存在しないため false となります。
処理の流れの解説
- 状態の保持: オブジェクト
prevで「直前の要素(element)」と「その連続回数(count)」を管理します。 - 連続判定: 現在の要素が直前の要素と等しく、かつ
countがすでに2であれば、同じ値が3つ並んでいることになるためtrueを即座に返します。 - カウントの更新: 現在の要素が直前と同じなら
countを1増やし、異なる場合は新しい連続の始まりとして1にリセットします。 - 最終的な戻り値: 最後まで走査しても条件を満たさなければ
falseを返します。
よりシンプルな別解
添字を使って隣接する3つの要素を直接比較する方法もあります。こちらはロジックがより直感的で、コードも読みやすいのが特徴です。
const checkThree = arr => {
for (let i = 0; i <= arr.length - 3; i++) {
if (arr[i] === arr[i + 1] && arr[i + 1] === arr[i + 2]) {
return true;
}
}
return false;
};
いずれの方法も計算量は O(n) で、配列を一度だけ走査すれば済むため、大きな配列に対しても効率的に動作します。
-
【Python】リスト内の連続した同一要素をカウントする方法
リストの中に連続して現れる同一要素が何種類あるかをカウントしたい場合には、forループによる反復処理と、append()メソッド、set()メソッドを組み合わせることで簡単に実装できます。 サンプルコード 以下に具体的な実装例を示します。 my_list = [24, 24, 24, 15, 15, 64, 64, 71, 13, 95, 100] print(The list is :) print(my_list) my_result = [] for index in range(0, len(my_list) - 1): if my_list[index] == my_li
-
Pythonで配列の要素が連続しているかどうかを判定する方法
数値の配列 nums が与えられたとき、その要素が連続した値(連番)になっているかどうかを判定する問題を考えてみましょう。 たとえば、入力が nums = [6, 8, 3, 5, 4, 7] の場合、要素を並べ替えると 3, 4, 5, 6, 7, 8 となり途切れがないため、出力は True になります。 解法のアプローチ この問題は、以下の手順で効率的に解くことができます。 配列のサイズが1未満の場合は False を返します。 配列の最小値 min_val と最大値 max_val を求めます。 (max_val - min_val + 1) が配列のサイズと一致しない場合、その範囲