Given an integer array nums, move all 0's to the end of it while maintaining the relative order of the non-zero elements.

Note that you must do this in-place without making a copy of the array.

 

Example 1:

Input: nums = [0,1,0,3,12]
Output: [1,3,12,0,0]

Example 2:

Input: nums = [0]
Output: [0]

 

Constraints:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

 

Follow up: Could you minimize the total number of operations done?




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

#         for i in range(l):
#             if nums[i] == 0:
#                 zeros+=1
#             else:
#                 nums[i-zeros] = nums[i]

#         while zeros!=0:
#             nums[l-zeros]=0
#             zeros-=1

        l = len(nums)
        i = 0
        while i<l:
            if nums[i] == 0:
                nums.pop(i)
                nums.append(0)
                l-=1
            else:
                i+=1

Random Note


From python 3.7 dict guarantees that order will be kept as they inserted, and popitem will use LIFO order but we need FIFO type system. so we need OrderedDict which have popIten(last = T/F) for this req. One thing, next(iter(dict)) will return the first key of the dict