You need to enable JavaScript to run this app. Python实现列表相邻同数三元组移除及销毁计数的代码优化问询
优惠活动
大模型
产品
解决方案
定价
更多

Python实现列表相邻同数三元组移除及销毁计数的代码优化问询

原代码的实际运行坑点
  • 索引无边界校验:curr_index无上限自增,删除元素后列表长度变短,此时继续累加索引必然会访问列表范围外的位置,触发索引越界错误
  • 计数逻辑完全错位:不管有没有找到符合要求的连续三元组,代码都会盲目执行removed_count +=3,和实际消除的元素数量完全不匹配
  • 删除动作错位:使用列表的remove(值)方法时,会匹配全列表第一个同值元素删除,而非当前瞄准位置的元素,很容易误删前面的同值元素,破坏列表原有结构
  • 扫描逻辑漏洞:删除中间的三元组后,前后相邻的元素会拼接成新的连续段,代码不回退扫描位置,会漏掉拼接出来的新可消除块
适配场景的优化方案

针对同色小球三连消除的规则,核心要满足两个逻辑要求:

  1. 删除元素时按位置切片操作,避免按值删除的错位问题
  2. 每完成一次删除操作,回退扫描位置检查拼接出的新段落,直到整轮扫描没有发现任何可消除的三元组,再停止流程

可直接运行的优化代码

def balls(a):
    removed_count = 0
    # 拷贝原列表,避免修改外部传入的原数据
    arr = a.copy()
    while len(arr) >= 3:
        has_found = False
        scan_pos = 0
        # 扫描边界留够两个位置,避免访问越界
        while scan_pos <= len(arr) - 3:
            # 检查当前位置是否有连续三个相同元素
            if arr[scan_pos] == arr[scan_pos+1] == arr[scan_pos+2]:
                removed_count += 3
                # 按位置直接切片删除三个元素
                del arr[scan_pos:scan_pos+3]
                has_found = True
                # 删除后回退扫描位置,检查前后拼接的新段落
                scan_pos = max(0, scan_pos - 2)
            else:
                scan_pos += 1
        # 一整轮扫描没找到可消除块,直接退出
        if not has_found:
            break
    return removed_count

# 测试示例
a = [3, 3, 4, 4, 4, 3, 4]
print(balls(a)) # 输出结果为6,符合预期
示例流程验证
  • 初始输入列表:[3,3,4,4,4,3,4]
  • 首次扫描在索引2位置发现连续三个4,删除后列表变为[3,3,3,4],累计消除数+3
  • 删除后回退扫描位置,在索引0位置发现拼接出来的连续三个3,删除后列表变为[4],累计消除数再+3
  • 此时列表长度不足3,停止扫描,总消除数为6,和预期结果一致

内容的提问来源于stack exchange,提问作者Johnny smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 00:24:00