机试打卡 -04 移动零(双指针)

 


最简单的方法(单指针):遍历 len(nums) 次,用 i 记录当前指针的位置。若当前元素非零,i+1;若当前元素为零,先del nums[i] 再向列表末尾添加0。

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """

        nums_len=len(nums)
        
        # 单指针
        i=0
        
        # 循环 nums_len 次
        for iter in range(nums_len):
            
            # 若元素不为零,指针+1
            if nums[i]!=0:
                i+=1
                continue
            
            # 若元素为零,删除当前元素并向末尾添0
            # 由于当前元素有删减,所以指针保持不动
            else:
                del nums[i]
                nums.append(0)
            

官方题解:双指针

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        n = len(nums)

        # 初始化左、右指针
        left = right = 0

        # 右指针一直向右移动
        while right < n:
            
            # 当右指针指向非零元素时,左指针的零与右指针的非零数交换
            if nums[right] != 0:
                nums[left], nums[right] = nums[right], nums[left]
                left += 1
            right += 1

难点:为什么每次交换时,左指针指向的是零元素?
        当第一次出现0元素之前,左右指针齐头并进。但当第一个0元素出现时,右指针和左指针同时指向该0元素,但随后右指针继续向右移动,直到下一个非零元素的交换。

        实际上,右指针左边直到左指针处均为0,即左右指针的位置差距就是0元素的个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值