You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测列表中的整数是否连续(含循环迭代场景)

问题描述

需要实现名为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:相邻元素直接校验法

思路

  1. 先检查子集是否有重复元素,有则直接返回False
  2. 遍历子集的相邻元素,验证每一对是否符合「后一个是前一个+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:模运算统一校验法

思路

  1. 先检查子集元素唯一性
  2. 以子集第一个元素为基准,将每个元素转换为(x - 起始元素) % 36的结果
  3. 如果子集是连续序列,转换后的结果必然是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 11:52:42