如何检测列表中的整数是否连续(含循环迭代场景)
问题描述
需要实现名为foo的函数,检测输入的整数列表(子集)是否满足以下条件:
- 子集元素是1到36(n=36)中的唯一整数
- 元素构成递增连续的序列,支持循环迭代(即36之后接续1)
示例如下:
# 合法示例 foo([1, 2, 3]) # True foo([8, 9, 10]) # True foo([35, 36, 1]) # True foo([36, 1, 2]) # True # 非法示例 foo([1, 3, 4]) # False(1之后应为2) foo([15, 17, 20]) # False(元素不连续) foo([3, 2, 1]) # False(顺序非递增连续) foo([1,2,3,1,2,3]) # False(元素重复且3之后应为4)
当前实现方法是创建双循环字符串模板(将1-36拼接成字符串后重复,再检查子集转字符串是否为其子串),现寻求更优方案。
优化方案
方案1:相邻元素直接校验法
思路
- 先检查子集是否有重复元素,有则直接返回False
- 遍历子集的相邻元素,验证每一对是否符合「后一个是前一个+1」,或是「前一个是36且后一个是1」的循环规则
代码示例
def foo(subset): n = 36 # 检查元素唯一性 if len(set(subset)) != len(subset): return False # 空列表按需求处理,这里默认返回True(可根据实际调整) if not subset: return True # 遍历校验相邻元素的连续性 for i in range(len(subset)-1): current = subset[i] next_val = subset[i+1] if not (next_val == current + 1 or (current == n and next_val == 1)): return False return True
优势
- 时间复杂度O(k)(k为子集长度),线性遍历效率高
- 无需额外构建大字符串,内存占用极低
- 逻辑直观,容易理解和维护
方案2:模运算统一校验法
思路
- 先检查子集元素唯一性
- 以子集第一个元素为基准,将每个元素转换为
(x - 起始元素) % 36的结果 - 如果子集是连续序列,转换后的结果必然是
0,1,2,...,k-1(k为子集长度),直接对比即可
代码示例
def foo(subset): n = 36 if len(set(subset)) != len(subset): return False k = len(subset) if k == 0: return True start = subset[0] # 生成预期的连续序列偏移值 expected = list(range(k)) # 计算当前子集的偏移值 actual = [(x - start) % n for x in subset] return actual == expected
优势
- 同样是O(k)时间复杂度,逻辑更简洁
- 用模运算统一处理普通连续和循环连续的情况,无需分支判断
方案对比
原字符串模板法存在明显局限:
- 需要构建长度为2n的字符串,n越大内存开销越高
- 数字转字符串时需处理位数问题(比如10是两位、1是一位),容易出现误匹配
- 效率不如线性遍历的方案
上述两种优化方案均避免了这些问题,更适合处理此类连续性校验场景。
内容的提问来源于stack exchange,提问作者Val
相关产品推荐
相关产品推荐

