题目:
思路
分情况:
- 如果列表只有一个值或者值都是重复,则返回列表即可
- 获取当前列表0的个数,从末尾开始遍历:如果0的个数=列表0个数,说明0都在列表后面且连续至0末尾,此时不需要进行0的转移。0的个数!=列表0个数,找到末尾遍历时最后遍历为0的数的位置i,这时候只需要遍历前i-1个数,找出0移至列表末尾即可
ps:
遍历前n项,如果更严谨点,需要分情况来定义i的值。
一种是 末尾第一个数不为0 此时i =len(nums),即遍历应该为列表长度 如[3,5,6]
另一种:末尾第一个数为0 此时i = len(nums)-1, 如 [1,0,3,0] 遍历前n项可以为[0:3]
而不用判断来定义i也可以是因为移动0是把0移至原列表的末尾,如:
i = len(nums)-1
假如 nums = [1,0,2,6] 此时遍历[1,0,2]也不会影响 因为是把0移至原列表的末尾
nums=[1,0,2,6,0] 此时遍历[1,0,2,6]
while nums[i]==0 and i>0,其中一种情况 [1,0,0]
class Solution(object):def moveZeroes(self, nums):""":type nums: List[int]:rtype: None Do not return anything, modify nums in-place instead."""count = nums.count(0)length = len(nums)if count ==len(nums) or len(nums)==1:return numsi = len(nums)-1t = 0while nums[i]==0 and i>0:t+=1if nums[i-1]!= 0:#0都排在列表后边且连续排至末位if t== count:return numselse:count = count - tbreakelse:i-=1j = 0while j<i and count>0:if nums[j]==0:nums.append(nums.pop(j))count-=1else:j+=1
严谨点方法:
class Solution(object):def moveZeroes(self, nums):""":type nums: List[int]:rtype: None Do not return anything, modify nums in-place instead."""count = nums.count(0)length = len(nums)if count == len(nums) or len(nums)==1:return numsif nums[-1]== 0:i = len(nums)-1t = 0while nums[i]==0 and i>0:t+=1if nums[i-1]!= 0:#0都排在列表后边且连续排至末位if t== count:return numselse:count = count - tbreakelse:i-=1else:i = len(nums)j = 0while j<i and count>0:if nums[j]==0:nums.append(nums.pop(j))count-=1else:j+=1return nums