283.移动零(快手)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
一些有缺陷的思路:从后往前
这个代码是错误的案例
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let slow = nums.length - 1, fast = nums.length - 1
while(fast >= 0) {
if(nums[fast] === 0) {
let temp = nums[slow]
nums[slow] = nums[fast]
nums[fast] = temp
slow--
}
fast--
}
return nums
};
图解:
正确的思路:
使用两个指针,快指针负责寻找不为0的位置,而慢指针负责记录第一个0的位置
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let slow = 0, fast = 0
while(fast < nums.length) {
if(nums[fast] === 0) {
fast++
} else {
[nums[slow], nums[fast]] = [nums[fast], nums[slow]]
fast++
slow++
}
}
};
图解: