1、题目:283. 移动零 - 力扣(LeetCode) (leetcode-cn.com)
2、实现
(1)方法一:
- 第一次遍历数组,将非零元素移动到数组的左侧,并使用一个指针j记录非零元素的位置;
- 第二次遍历数组,从非零元素的下一位开始,到数组的末尾,即j~nums.length-1的元素都置为0。
代码:
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let j = 0;
// 第一次遍历数组,将所有非0字符串全部移到数组的最左侧
for(let i=0; i<nums.length; i++) {
if(nums[i] !== 0) {
nums[j] = nums[i];
j++;
}
}
// 当数组第一次遍历结束,j在非零元素的下一位
// 以010312为例,那j为3
// 将从j开始的元素置为0
for(let i=j; i<= nums.length-1; i++) {
nums[i] = 0;
}
return nums;
};
(2)方法二:参考快速排序的思想(将参考值设置为0)
- 只需要遍历一次数组,如果元素为非零元素,则将其交换到数组左侧,将0交换到数组右侧。
代码:
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let j = 0;
for(let i=0; i<nums.length; i++) {
// 参考快速排序的思想
// 当前元素不为0,交换到左边,等于0的交换到右边
if(nums[i] !== 0) {
let temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
j++;
}
}
};
3、参考:
动画演示 283.移动零 - 移动零 - 力扣(LeetCode) (leetcode-cn.com)
4、补充:快速排序思想