283. 移动零:给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作
方法一:
思路:
- 从后往前遍历原数组,值等于
0
时,splice(i, 1)
原地删除,再通过nums.push(0)
把0
加入到数组尾部,数组正常遍历就行,不需要额外操作i
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let len = nums.length
for(let i = len - 1; i >= 0; i--) {
if(nums[i] === 0) {
nums.splice(i, 1)
nums.push(0)
}
}
};
方法二:
思路:
- 采用快慢指针的方式,当
j
指针不等于0
时,替换指针i
和指针j
位置的值,最终会将所有不是0
的值都按顺序赋值到前方,而0
必定会被替换到后方 - 打个比方说数组里每个数字都是一个球,有两个篮子一个球名字叫
i
,另一个叫j
,当篮子j
内的球上的数字 不等于0
时,就和篮子i
内的球替换,然后篮子i
往后移动一个位置,当篮子j
走完和所有球都比较完之后,篮子i
左边的所有球上的数字都应该是 不等于0
的,那剩下 等于0
的球将都在篮子i
的右边
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let len = nums.length
let i = 0
for(let j = 0; j < len; j++) {
if(nums[j] !== 0) {
// 解构赋值的形式 替换两个位置的位置的值
[nums[i], nums[j]] = [nums[j], nums[i]]
i++
}
}
};