LeetCode题目调试:Python函数未返回预期结果问题排查
问题分析:makeGood函数未返回预期结果且后续逻辑持续执行
问题描述
在LeetCode刷题时,编写的makeGood函数未返回预期结果,且执行时会继续运行后续不必要的逻辑。
原代码
def makeGood(s: str) -> str: print('fisrst s: ', s) s_list = list(s) for n in range(len(s)-1): print('n: ', n) if s[n].lower() == s[n+1].lower() and s[n] != s[n+1]: s_list.remove(s[n]) s_list.remove(s[n + 1]) print('list: ', len(s_list)) s = ''.join(s_list) if len(s_list) == 0: print('00000') print(s) break else: makeGood(s) print('out') return s res = makeGood("abBAcC") print('res: ', res)
执行输出
fisrst s: abBAcC n: 0 n: 1 list: 4 fisrst s: aAcC n: 0 list: 2 fisrst s: cC n: 0 list: 0 00000 out n: 1
原因解析
递归调用未传递结果
当你在else分支调用makeGood(s)时,仅执行了递归函数,但没有接收或返回它的处理结果。上层函数会继续执行原循环逻辑,最终返回的是当前层修改后的s,而非递归处理后的最终空字符串。循环范围固定,未动态更新
for n in range(len(s)-1)的循环范围在函数启动时就已确定(基于初始字符串长度)。即使后续修改了s的长度,循环仍会按初始范围执行,导致多余的迭代(比如输出中最后的n: 1)。remove方法存在隐患s_list.remove(s[n])会删除列表中第一个匹配的元素,而非指定位置的元素。如果字符串存在重复字符,这会导致删除错误的元素,破坏预期的处理逻辑。
修正方案
方案1:修正递归逻辑
def makeGood(s: str) -> str: s_list = list(s) for n in range(len(s_list)-1): if s_list[n].lower() == s_list[n+1].lower() and s_list[n] != s_list[n+1]: # 精准删除相邻的两个目标元素 del s_list[n:n+2] # 递归处理新字符串并直接返回结果 return makeGood(''.join(s_list)) # 无需要删除的元素,返回当前字符串 return ''.join(s_list)
方案2:使用栈实现(更高效)
栈方法避免了递归的开销,逻辑更直观:
def makeGood(s: str) -> str: stack = [] for char in s: # 检查栈顶元素与当前字符是否为大小写相反的同一字符 if stack and stack[-1].lower() == char.lower() and stack[-1] != char: stack.pop() else: stack.append(char) return ''.join(stack)
修正说明
- 递归方案中,找到匹配对后直接返回递归处理结果,终止当前层的后续循环,确保上层拿到最终处理后的字符串。
- 使用
del s_list[n:n+2]替代remove,精准删除指定位置的相邻元素,避免匹配错误。 - 栈方案通过遍历一次字符串完成处理,时间复杂度为O(n),空间复杂度为O(n),效率更高。
内容的提问来源于stack exchange,提问作者user18176237
相关产品推荐
相关产品推荐

