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++;
        }
    }
};

参考资料