class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        main idea: by default set idx =0 as non-zero val; loop through whole array, if find non zero val, assign it to idx=0 ; idx ++; then fill out the rest start from idx 
        time O(N) space O(1)
        """
        if not nums:
            return 
        nonz = 0
        for i in range(len(nums)):
            if nums[i]:
                nums[nonz] = nums[i]
                nonz += 1
        for j in range(nonz,len(nums)):
            nums[j] = 0

optimization

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        main idea: by default set idx =0 as non-zero val; loop through whole array, if find non zero val, swap with val at idx=0 ; idx ++; loop until nums ends.  here we do not need to have additional loop
        time O(N) space O(1)
        """
        if not nums:
            return 
        nonz = 0
        for i in range(len(nums)):
            if nums[i]:
                nums[nonz],nums[i] = nums[i],nums[nonz]
                nonz += 1