# 283 Move Zeroes (有圖)
運用 es6 的 寫 swap / 有用到排序的作法,兩兩比較決定是否交換 (Bubble Sort) / for 裡面也可以 i--
Given an array nums,
write a function to move all 0's to the end of it while maintaining
the relative order of the non-zero elements.
input: 數字陣列
output: 把 0 都移到最後面
Example:
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]
Note:
You must do this in-place without making a copy of the array.
Minimize the total number of operations.
*/
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {}
如何解
本來想說 sort 有沒有解,例如
[0,1,0,3,12].sort((a, b) => {
if(a ==0 || b ==0) return 1;
return 0;
}
後來發現不可行 (太天真)。所以這題其實就是用 Two pointer 解最快啦

let pointer = 0;
let ind = 0

若 nums[ind] == 0 那就 ind ++;
if(nums[ind] == 0){
ind ++;
}

若 nums[ind] != 0 那就跟 nums[pointer 交換位置],然後 ind ++, pointer ++
else{
swap(nums, ind, pointer);
ind ++;
pointer ++;
}
重要的是要寫一個交換的 function
function swap(arr, ind1, ind2){
[arr[ind1], arr[ind2]] = [arr[ind2], arr[ind1]];
}
完整程式碼
var moveZeroes = function(nums) {
let pointer = 0;
let ind = 0
while(ind < nums.length){
if(nums[ind] == 0){
ind ++;
}else{
swap(nums, ind, pointer);
ind ++;
pointer ++;
}
}
return nums;
};
function swap(arr, ind1, ind2){
[arr[ind1], arr[ind2]] = [arr[ind2], arr[ind1]];
}
console.log(moveZeroes([1,5,0,3,12]))
// faster than 94.35% of JavaScript online submissions
另一個解法
var moveZeroes = function(nums) {
let pointer = 0;
for(let i=0; i<nums.length; i++){
if(nums[i] !== 0){
nums[pointer] = nums[i]
pointer ++
}
}
for(let i= pointer; i<nums.length; i++){
nums[i] = 0
}
return nums
};
學到什麼
第一個是交換 function,可以用 es6 的新語法
two pointer 概念
Last updated
Was this helpful?