python力扣283.移动零

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

刚开始思路比较简答:遍历nums,遇到0就删除,然后添加到末尾。

但没有通过全部测试用例,原因是遍历的时候无法考虑如果有两个0挨着的情况,如果将前一个0删除,再添加到末尾,那列表整体向前挪动,遍历会指向下一个位置,那就会错过后一个0。

查询了官方题解,思路为:使用双指针,指针开始位置均为0,left指针指向已经处理完的非0序列,right指针指向遍历的位置。如果遍历到非0元素,right的元素与left交换,left向后移动一位(已经有一位处理完成),right向后移动一位,如果遍历到0,则只有right向后移动。

中心思想就是将处理完成的序列的最后一个,与未处理的序列的第一个非0数进行交换,这样不会改变非0序列的顺序,0被“挤”到后面去了。

class Solution(object):
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        l = r = 0
        n = len(nums)
        while r < n:
            if nums[r] != 0:
                nums[r], nums[l] = nums[l], nums[r]
                l += 1
                r += 1
            else:
                r += 1

官方题解中无else,添加后比较清晰,使小白容易理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值