# 283 Move Zeroes (有圖)

運用 es6 的 寫 swap / 有用到排序的作法,兩兩比較決定是否交換 (Bubble Sort) / for 裡面也可以 i--

LeetCode

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