类糖果传奇横向消除程序报错:列表索引越界问题排查
问题排查与修复:类糖果传奇消除功能的IndexError问题
错误原因分析
触发IndexError: list index out of range的核心原因有两个:
- 遍历过程中修改列表长度:你在
for i in range(len(list)-2)的循环里直接执行pop删除元素,导致列表长度动态缩短,但循环的迭代次数是基于初始列表长度计算的。比如初始列表长度为5,循环会执行3次(i=0,1,2),但如果i=0时删除了3个元素,列表长度变为2,当i=2时,i+2=4就会超出新列表的索引范围。 - 变量名冲突:使用了Python内置类型
list作为变量名,会覆盖内置函数,虽然不是直接报错原因,但属于不良编码习惯。
另外原代码还有两个逻辑缺陷:
- 仅处理连续3个相同字符的情况,连续4个及以上(比如
"aaaa")无法完全消除。 - 消除一轮后直接结束,没有处理消除后新产生的连续相同字符(比如
"aabbbaaa"消除中间bbb后变成"aaaa",需要再次消除)。
修复后的代码
采用栈结构来处理消除逻辑,这是解决此类连续消除问题的高效方案,同时修复了索引错误和逻辑缺陷:
print("Hello! Welcome to Candy Crush!") while True: decision = input("Would you like to add a string? ") if decision.lower() == "yes": input_str = input("Please enter a string: ") candy_list = list(input_str) print("Your original list is", candy_list) print("Your original string: ", input_str) # 使用栈实现循环消除逻辑 stack = [] for char in candy_list: stack.append(char) # 检查栈顶3个元素是否相同,相同则弹出 while len(stack) >= 3 and stack[-1] == stack[-2] == stack[-3]: # 弹出连续3个相同元素 stack.pop() stack.pop() stack.pop() print("Your trimmed list is", stack) result = "".join(stack) print("\nThe output of your string is: ", result) elif decision.lower() == "no": print("Thank you for playing! Have a great day!") break else: print("Invalid input! Please enter Yes/No.")
代码改进说明
- 栈结构消除逻辑:遍历每个字符入栈,每次入栈后检查栈顶3个元素是否相同,相同则弹出,自动处理多轮消除(包括消除后新产生的连续字符)。
- 避免列表遍历修改:不再在循环中直接修改原列表,彻底解决索引越界问题。
- 优化输入判断:用
lower()统一转换为小写,简化判断逻辑,同时增加无效输入提示。 - 变量名规范:改用
candy_list替代内置list作为变量名,避免命名冲突。
内容的提问来源于stack exchange,提问作者Dark _Knight
相关产品推荐
相关产品推荐

