Pythonで配列に連続した整数(重複可)が含まれているか判定する方法
はじめに
Pythonでは、数値の配列(リスト)に連続した整数が含まれているかどうかを判定したい場面があります。ここでの「連続」とは、要素が重複していてもよいものの、値そのものは途切れることなく並んでいる状態を指します。
例えば、次のようなリストを考えてみましょう。
nums = [6, 8, 8, 3, 3, 3, 5, 4, 4, 7]
このリストには重複する要素が含まれていますが、ユニークな値を取り出すと 3, 4, 5, 6, 7, 8 となり、途切れのない連続した整数になっています。この場合、判定結果は True となります。
解決のアプローチ
この問題は、以下の手順でシンプルに解決できます。
- リスト
numsを昇順にソートします。 - インデックス 1 から最後まで走査し、隣接する要素同士の差を確認します。
- もし
nums[i] - nums[i-1]が 1 より大きい場合、数列に「抜け」があるため False を返します。 - すべての隣接要素の差が 1 以下であれば、連続した整数とみなせるため True を返します。
ソート後は同じ値が隣り合うため、差が 0 の場合は重複として無視され、差が 1 の場合は連続していると判断されます。差が 2 以上になると、そこで数列が途切れていることになります。
実装例
それでは、実際のコードを見てみましょう。
def solve(nums):
nums.sort()
for i in range(1, len(nums)):
if nums[i] - nums[i-1] > 1:
return False
return True
nums = [6, 8, 8, 3, 3, 3, 5, 4, 4, 7]
print(solve(nums))入力
[6, 8, 8, 3, 3, 3, 5, 4, 4, 7]
出力
True
計算量について
このアルゴリズムの計算量は、ソート処理が支配的となるため O(n log n) です。走査部分は線形時間 O(n) で完了します。
なお、set() を使って重複を除去してから最小値・最大値の差と要素数を比較する方法もありますが、この方法でもソートベースの手法と同様に O(n log n) の計算量となります。状況に応じて読みやすい方を選択するとよいでしょう。
まとめ
配列をソートして隣接要素の差を確認するだけで、重複を含むリストが連続した整数で構成されているかどうかを簡単に判定できます。コードも短く直感的なので、面接や実務の両方で役立つテクニックです。
-
【Python入門】リストの要素が回文かどうかを判定する方法
Pythonでは、数値や文字列のリストが回文(前から読んでも後ろから読んでも同じ並び)になっているかどうかを簡単に判定できます。 例えば、次のようなリストが与えられたとします。 nums = [10, 12, 15, 12, 10] この場合、前から読んでも後ろから読んでも 10, 12, 15, 12, 10 と同じ順序になるため、出力は True となります。 解決の手順 リストが回文かどうかを確認するには、以下の手順に従います。 変数 n にリストのサイズ(要素数)を代入する フラグ用の変数 is_palindrome を初期化する インデックス i を 0 で初期化する i が n
-
Pythonで連続する数値の区間を検出するプログラムの書き方
一意な(重複のない)数値のリスト nums が与えられたとします。このとき、nums 内で連続している数値をひとつの包括的な区間としてまとめ、ソート済みの2次元配列として出力することを目標とします。たとえば、入力が nums = [10, 11, 12, 15, 16, 17, 28, 30] の場合、出力は [[10, 12], [15, 17], [28, 28], [30, 30]] となります。これは、10〜12 と 15〜17 がそれぞれ連続した数値のまとまりである一方、28 と 30 は前後の数値とつながっていないため、単独の区間 [28, 28]、[30, 30] として表現され