283. 移动零

发布时间 2023-10-21 13:28:45作者: Frommoon

题目

  • 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

    请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

法一、暴力法

  • 遍历找到零元素,并暂时保存,然后在零元素往后的都前移一位,最后在给最后一位赋给暂存的值
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        for i in range(n):
            if nums[i] == 0:
                
                for j in range(i+1,n):
                    nums[j-1] = nums[j]
                    j += 1
            nums[n-1] = 0
            i +=1
  • 错误:当测试用例刚好有两个挨着的0元素时就会报错。
  • 原因:当遇到第一个0元素时,0元素后面的依次往前一位,最后一位补0,然后进行i+1进行判断,此时,第二个0元素补在了一个0元素原来的位置,i+1直接跳过了第二个0元素的判断,导致出错。
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        i = 0
        while i < n:
            if nums[i] == 0:
                for j in range(i+1, n):
                    nums[j-1] = nums[j]
                nums[n-1] = 0
                if nums[i] != 0 and i > 0:
                    i += 1
                else:
                    i = i
                    if i < 0:  # 处理i小于0的情况
                        i = 0
            else:
                i += 1
  • 超出时间限制
  • 该方法没有成功解决问题,欢迎大家多多指教

法二、双指针

class Solution:
    def moveZeroes(self, nums):
        i = 0
        j = 0
        n = len(nums)
        
        for i in range(n):#把数组中不是0元素的往前移
            nums[j] = nums[i]
            if nums[i] != 0:#当元素不为0时j才往后移一位,,是0时不动等着nums[j] = nums[i]不为0的替代
                j += 1  #j最终停在最后一个不为0的元素
        
        while j < n:#剩余的位置全部补0
            nums[j] = 0
            j += 1

法三、pop+append

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        n = len(nums)
        i = 0
        while i < n:
            if nums[i] == 0:
                nums.pop(i)#将其从数组中移除
                nums.append(0)#将零追加到数组的末尾
                n -= 1#由于零元素已经被移动到末尾,所以数组的长度 n 减 1
            else:#如果当前元素不是零
                i += 1#则将索引 i 的值增加 1,以继续下一轮迭代