文巾解题 283. 移动零

1 题目描述

2 解题思路

方法1 双指针:交换数组

        我们设立一个左指针left,表示[0,left)是已经处理好的,全是非0数的保序数列;同时我们设立一个右指针right,表示[right,len(nums))是我们没有遍历的原数组部分。

        我们需要注意一点,只要我们之前遍历的时候发现了0。那么[left,right)这一部分就全是0。

        每次将right向后移动一格。

                如果right所在位置的元素非0,那么就将right位置的元素和left位置的元素互换(即用一个非零数代替一个零),然后left也想后走一格

                如果right所在位置的元素为0,那么left不动,只是right走一格

        当right遍历完的时候,所有的非零数都被换到0的前面去了,同时保序。

class Solution(object):
    def moveZeroes(self, nums):
        right=0
        left=0
        l=len(nums)
        while(right<l):
            if(nums[right]!=0):
                nums[left],nums[right]=nums[right],nums[left]
                right+=1
                left+=1
            elif(nums[right]==0):
                right+=1

方法2 双指针2.0:快慢指针

 设计一个快慢指针,快指针每次向后走一格。

如果快指针位置的元素为0,那么满指针不动;

如果快指针位置的元素不为0,那么将快指针当前位置的元素赋值给慢指针。

这样快指针遍历完之后,所有的非零指针都在前面了,而且保序。

此时把慢指针后面的部分设置为0即可

class Solution(object):
    def moveZeroes(self, nums):
        fast=0
        slow=0
        l=len(nums)
        while(fast<l):
            if(nums[fast]!=0):
                nums[slow]=nums[fast]
                slow+=1
                fast+=1
            elif(nums[fast]==0):
                fast+=1
        for i in range(slow,l):
            nums[i]=0
        return(nums)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值