Skip to main content

移动零

题意

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

解法

使用同向双指针的方式进行遍历数组。
每一步:先找出第一个数字 0 的下标zeroIndex,
然后,从zeroIndex开始,找出第一个非0数字,
接着将两个数字进行交换。
然后,继续上述步骤,直到到达数组尾部。

/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
const n = nums.length;
if(n < 2){
return;
}

let zeroIndex = 0;
let numIndex = 0;

while(numIndex < n && zeroIndex < n - 1){
// 找出第一个为零的数字
while(nums[zeroIndex] !== 0 && zeroIndex < n){
zeroIndex++;
}
numIndex = zeroIndex;
// 从为零数字的下标开始,找出第一个非零的数字
while(nums[numIndex] == 0 && numIndex < n){
numIndex++;
}
// 将两个数字进行交换
if(zeroIndex < n && numIndex < n){
nums[zeroIndex] = nums[numIndex];
nums[numIndex] = 0;
}
}
};