Leetcode(27)-- 移除元素

给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度5,并且 nums 中的前五个元素为0,1,3,0,4

方法一:直接使用删除的方法(简单版)

class Solution:
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """
        l = len(nums)
        i = 0
        while i<l:
            if nums[i]==val:
                nums.remove(nums[i])
                l-=1
            else:
                i+=1
        return len(nums)

小结:注意这里使用的列表如果使用删除的话,列表的索引会自动跟着变化的, 从删除的位置之后所有的元素会整体向前移,所以这点是关键,需要注意,给个例子,你就会明白。

li = [1,2,2,3,4,5,6]
for i in range(len(li)):
    if li[i]==2:
        li.remove(li[i])
    print(li[i])


Traceback (most recent call last):
1
2
3
4
5
6
  File "E:/python代码文件/作业/Tensorflow/Tersorflow-1.py", line 7, in <module>
    if li[i]==2:
IndexError: list index out of range

Process finished with exit code 1

        从这里可以看出,当删除第一个2之后,第二个2会向前移动,索引也会跟着变化,第二个的2的索引从开始的2变成后来的1(索引),所以你会看到还有2输出(我们的本意是删除列表中所有2,有没有发现,当我们用列表时,使用删除的操作的时候,要格外注意这点),当然len(li)也就变化了吗。即从删除的地方开始所有后面的元素会整体向前移动。

第二种方法:双指针的方法

这个和前面的一题极其的相似,可以对照着看下。

class Solution:
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """
        i =0
        j =0
        for i in range(len(nums)):
            if nums[i]!=val:
                nums[j]=nums[i]
                j+=1
            else:
                continue
        return j
            

猜你喜欢

转载自blog.csdn.net/qq_20412595/article/details/82729465