MoveZeroes

Published at 2021-11-10

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

        for i in range(1, len(nums)):
            if nums[i] != 0 and nums[pointer] == 0:
                nums[i], nums[pointer] = nums[pointer], nums[i]

            # 포인터는 젤 처음 나오는 0의 인덱스여야함
            # 매 턴마다 포인터를 증가시키면 연속되는 0이 나올경우
            # 두번째 0으로 가버림
            if nums[pointer] != 0: pointer += 1

        # pointer와 i로 비교
        # pointer에는 제일 처음 나오는 0을, i에는 그 0묶음 다음의 첫 양수를 가리키고 있어야함
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let p = 0;  // 0 위치를 가리킬 포인터
    for (const i in nums){
        const num = nums[i];
        if(nums[p] === 0 && num !== 0){
            const temp = nums[p];
            nums[p] = nums[i]
            nums[i] = temp
        }
        if(nums[p] !== 0) p ++;
    }
};

/*
[two pointer]
제일 처음 나오는 0을 가리킬 포인터를 만듦
그리고 nums를 순회하면서 0이 아닌 숫자가 나왔을 때 0하고 위치를 바꾸고 포인터는 증가시킴
!!! 0의 포인터가 0이 아닐경우에만 증가시켜야함
*/