283. 移动零
题目描述(难度:简单)
- 给定一个数组
nums
,编写一个函数将所有0
移动到数组的末尾,同时保持非零元素的相对顺序。说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
示例:
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]
解题思路
- 逆向遍历:从数组最后开始遍历,遇到是0的元素,先删除这个0,再向数组最后补充0
- 交换法:纪录 0 的数量,当遇见非 0,交换 0 于当前元素的位置
- 前移法:建立新索引,当遇见非0,赋予当前元素值,索引增加,最后新索引之后的数组空间补充 0
代码
// 逆向遍历
var moveZeroes = function(nums) {
for(let i=nums.length;i>=0;i--){
if(nums[i] === 0){
nums.splice(i,1);
nums.push(0);
}
}
return nums;
};
/**
* 前移法
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let count = 0;
for(let i = 0; i < nums.length; i++) {
if (nums[i]) {
// 非 0 元素,新索引赋予当前值,新索引累加
nums[count++] = nums[i];
}
}
// 新索引后补充 0
while(count < nums.length) {
nums[count++] = 0;
}
return nums
};
/**
* 交换法
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
const moveZeroes = function (nums) {
let j = 0;
let temp = '';
for (let i = 0; i < nums.length; i++) {
if (nums[i] !== 0) {
temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
j++;
}
}
};