文巾解题 283. 移动零

Posted UQI-LIUWJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文巾解题 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)

 

以上是关于文巾解题 283. 移动零的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode第5天 - 283. 移动零 | 167. 两数之和 II - 输入有序数组

LeedCode 283. 移动零

java刷题--283 移动零

java刷题--283移动零

文巾解题 793. 阶乘函数后 K 个零

LeetCode 283. 移动零c++/java详细题解