var moveZeroes = function (nums) {
let isZero = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] !== 0) {
nums[isZero] = nums[i];
isZero++;
}
}
for (; isZero < nums.length; isZero++) nums[isZero] = 0;
return nums;
};
let nums = [0, 1, 0, 3, 12];
moveZeroes(nums);
이 문제는 투 포인터의 기본적인 동작을 알 수 있는 문제라고 소개한다.(Leetcode에서)
그냥 문제에서 제시한대로 splice
메서드를 이용한다면 O(N*N)의 시간복잡도로 문제를 해결할 수 있다. 그러나 투 포인터를 사용한다면 O(N)의 시간복잡도로 문제를 해결할 수 있다.
문제에서 0은 배열의 뒤쪽으로 옮기라고 했으니, 0이 아닌 숫자들을 찾아서 모두 앞으로 가져온다. 그리고 isZero
포인터를 0이 아닌 숫자를 찾을 때마다 한 칸씩 앞으로 이동하도록 만든다.
그럼 첫 번째 반복문을 다 돌고 나면 nums
배열은 [ 1, 3, 12, 3, 12 ]
이 된다. 그럼 [1, 3, 12, 0, 0]
으로 만들어 줘야 할텐데, isZero
포인터는 첫 번째 반복문이 끝난 현재 3이기 때문에, index 3부터 nums.length - 1
index까지 0으로 바꿔주면 된다.
수정, 지적을 환영합니다!
https://leetcode.com/problems/move-zeroes/