虽然网上很多这样的文章,但是还是要再写一遍,加深自己的印象。
今天在刷 LeetCode 的时候,有一道很简单的题目:
移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
这样一看,很简单,for 判断一下再删除就好了。于是第一版代码提交上去
for i in nums:
if i == val:
nums.remove(i)
结果发现最后一个元素没有被删除掉。于是百度之,理解了一下 for 删除的操作。
python 中用 for 发起任何形式的遍历时,它的遍历顺序都是从最初就确定的,而在遍历中删除了元素会导致当前索引的变化,所以遍历中间取到的索引的那个值已经变了,会漏掉一些元素。另一种错误是删除元素后列表长度缩小了,所以会超出索引范围。
原数组为 [1,2,2,0,2],假设要删除所有的 2 元素
第一次执行 nums.remove(i) ,元素一不相等不执行操作,数组为 [1,2,2,0,2]
第二次执行 nums.remove(i) ,元素二相等,删除,数组为 [1,2,0,2]
第三次执行 nums.remove(i) ,元素三相等,删除,数组为 [1,0,2]
第四次执行 nums.remove(i) ,没有元素四
第五次执行 nums.remove(i) ,没有元素五
如果要完成这道题目的话,可以采用倒序删除的方式
for i in nums[::-1]:
if i == val:
nums.remove(i)