文巾解题 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. 移动零的主要内容,如果未能解决你的问题,请参考以下文章