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++
}
}
};