LeetCode 27.Remove Element:Python解法输出异常求排查
解决LeetCode 27题Remove Element的错误分析
问题根源:列表推导式重新赋值未修改原数组对象
你用nums = [x for x in nums if x != val]的做法,本质是创建了一个全新的列表,然后让函数内部的nums变量指向这个新列表。但LeetCode的判题逻辑是检查传入的原数组对象的前k个元素——因为题目要求的是「in-place(原地)修改」,必须直接修改原数组的内容,而不是重新赋值变量指向新对象。
举个例子:假设函数外部传入的原数组是对象A,你在函数里把nums改成指向新列表B,此时外部的数组还是A,判题系统读取的是A的前k个元素,自然和你预期的不符。你自己打印的是函数内部的nums(也就是B),所以看起来是对的,但系统判题用的是原数组A。
正确的原地修改解法(双指针法)
用双指针实现原地修改,不需要创建新列表,直接在原数组上操作:
def removeElement(nums, val): slow = 0 for fast in range(len(nums)): if nums[fast] != val: nums[slow] = nums[fast] slow += 1 return slow
这个方法的逻辑:
- 慢指针
slow记录下一个非val元素要放置的位置 - 快指针
fast遍历整个数组,遇到不等于val的元素,就把它放到慢指针的位置,然后慢指针右移 - 最后返回
slow,也就是非val元素的数量,此时原数组的前slow个元素已经全部是目标元素
验证你的测试用例
对于测试用例nums=[0,1,2,2,3,0,4,2]、val=2:
- 遍历结束后,
slow的值是5,原数组的前5个元素会被修改为[0,1,3,0,4],完全符合题目要求,判题系统就能正确识别。
内容的提问来源于stack exchange,提问作者Polina
相关产品推荐
相关产品推荐

