Python实现列表相邻同数三元组移除及销毁计数的代码优化问询
原代码的实际运行坑点
- 索引无边界校验:
curr_index无上限自增,删除元素后列表长度变短,此时继续累加索引必然会访问列表范围外的位置,触发索引越界错误 - 计数逻辑完全错位:不管有没有找到符合要求的连续三元组,代码都会盲目执行
removed_count +=3,和实际消除的元素数量完全不匹配 - 删除动作错位:使用列表的
remove(值)方法时,会匹配全列表第一个同值元素删除,而非当前瞄准位置的元素,很容易误删前面的同值元素,破坏列表原有结构 - 扫描逻辑漏洞:删除中间的三元组后,前后相邻的元素会拼接成新的连续段,代码不回退扫描位置,会漏掉拼接出来的新可消除块
适配场景的优化方案
针对同色小球三连消除的规则,核心要满足两个逻辑要求:
- 删除元素时按位置切片操作,避免按值删除的错位问题
- 每完成一次删除操作,回退扫描位置检查拼接出的新段落,直到整轮扫描没有发现任何可消除的三元组,再停止流程
可直接运行的优化代码
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
相关产品推荐
相关产品推荐

