283. Move Zeroes

Leetcode 問題: 283. Move Zeroes

題目

Given an integer array nums, move all 0's to the end of it while maintaining the relative order of the non-zero elements.

Note that you must do this in-place without making a copy of the array.

傳入一個整數陣列 nums,將所有的 0 移動到右方尾巴

但必須要保持原本的 非 0 數字維持他原本的排序,且不能用複製陣列的方式,必須直接修改原本陣列值

Example

Input: nums = [0,1,0,3,12]
Output: [1,3,12,0,0]
Input: nums = [0]
Output: [0]

演算法

1. 設定存放左方非 0 整數指標位置

因為原本條件,所有的 0 移動到右方 = 所有的 非0 移動到左方

所以可以依序找到所有 非 0 的整數,然後將他交換放到 左方非 0 整數指標

因為是依照陣列順序去執行,所以原本整數陣列 nums非 0整數順序也不會被改到,會依序地放入

答案

JavaScript

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
function moveZeroes(numsList) {
    var _a;
    // 左方非 0 整數指標
    var leftNonZeroNumberPointer = 0;
    for (var i = 0; i < numsList.length; i++) {
        // 目前整數
        var currentNumber = numsList[i];
        if (currentNumber != 0) {
            // 當檢查到的整數不是 0,將整數交換移動到左方
            _a = [numsList[i], numsList[leftNonZeroNumberPointer]], numsList[leftNonZeroNumberPointer] = _a[0], numsList[i] = _a[1];
            // 繼續找下一個非 0 整數
            leftNonZeroNumberPointer++;
        }
    }
}

TypeScript

/**
 Do not return anything, modify nums in-place instead.
 */
function moveZeroes(numsList: number[]): void {
    // 左方非 0 整數指標
    let leftNonZeroNumberPointer = 0;

    for (let i = 0; i < numsList.length; i++) {
        // 目前整數
        let currentNumber = numsList[i];
        if (currentNumber != 0) {
            // 當檢查到的整數不是 0,將整數交換移動到左方
            [numsList[leftNonZeroNumberPointer], numsList[i]] = [numsList[i], numsList[leftNonZeroNumberPointer]];
            // 繼續找下一個非 0 整數
            leftNonZeroNumberPointer++;
        }
    }
};

參考資料