移除相邻重复数字的函数异常排查求助
问题排查与修复方案
我来帮你揪出这个问题的根源!你的思路方向是对的,但问题出在遍历列表副本的同时修改原列表,并且误用了remove()方法的行为。
问题分析
你用numList[:]创建了原列表的副本进行遍历,但每次调用numList.remove(i)时,它会移除原列表中第一个等于i的元素,而不是你当前遍历到的那个元素。这就导致了逻辑错位:
拿你的测试用例[2,2,4,4,2,2,5,5]来说:
- 前两次遍历到的都是
2,第二次执行numList.remove(2)时,会移除原列表的第一个2,此时原列表变成[2,4,4,2,2,5,5]。 - 后续遍历到
2时,remove()又会优先移除原列表开头的2,直接打乱了原本要保留的“非相邻重复”逻辑,最终得到错误的[4,2,2,5]。
修复方案
更安全清晰的做法是创建新列表来构建结果,而不是修改原列表。这样完全避免了元素匹配和索引错位的问题:
def removeAdjacentNumbers(numList): if not numList: # 处理空列表的边界情况 return [] # 初始化结果列表,加入第一个元素 result = [numList[0]] # 从第二个元素开始遍历原列表 for num in numList[1:]: # 如果当前元素和结果列表最后一个元素不同,就加入结果 if num != result[-1]: result.append(num) return result def main(): print(removeAdjacentNumbers([2,2,4,4,2,2,5,5])) # 输出 [2,4,2,5] if __name__== "__main__": main()
方案说明
- 先判断列表是否为空,避免后续访问
numList[0]时出现索引错误。 - 用结果列表记录最终要返回的元素,每次只需要对比当前元素和结果列表的最后一个元素,不同就追加,完美实现“移除相邻重复”的逻辑。
- 这个实现的时间复杂度是O(n),效率很高,也更容易理解和维护。
内容的提问来源于stack exchange,提问作者Grace Combs
相关产品推荐
相关产品推荐

