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

# # 283 Move Zeroes (有圖)

[LeetCode](https://leetcode.com/problems/move-zeroes/)

```
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 解最快啦

![](https://1787585077-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LqirD3iAZIDk4oDCfwS%2F-LrR4yBnmambepgFqE4w%2F-LrR5ipaLEaJEn08Ragf%2F1.jpg?alt=media\&token=115069bc-1f56-4330-bf20-382ec5f21ae0)

```
let pointer = 0;
let ind = 0
```

![](https://1787585077-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LqirD3iAZIDk4oDCfwS%2F-LrR4yBnmambepgFqE4w%2F-LrR5orVzOzUQZWZIvny%2F2.jpg?alt=media\&token=a7465232-9986-4e05-b2d7-db0e414299f8)

若 nums\[ind] == 0 那就 ind ++;

```
if(nums[ind] == 0){
    ind ++;
}
```

![](https://1787585077-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LqirD3iAZIDk4oDCfwS%2F-LrR4yBnmambepgFqE4w%2F-LrR5zuUddzZDSdWgQPk%2F3.jpg?alt=media\&token=e955d646-f992-4acc-b7d0-8bf294a426bc)

若 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
```

### 另一個解法

```javascript

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 概念
