要求将数组中的零全部移动到最右边,并保证非零元素的相对位置不变【题目地址】
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
示例 3:
输入: nums = [1,0,1]
输出: [1,1,0]
思路分析:
- 利用双指针(快慢指针),快指针遍历数组,慢指针记录下一个非零元素应该放置的位置
- 使用fast指针从头到位遍历数组。
- 如果nums[fast]是非零元素,则将nums[slow]与nums[fast]交换。
code1:
let slow = 0, fast =0;
while(fast < nums.length){
if(nums[fast] !== 0){
[nums[slow],nums[fast]] = [nums[fast],nums[slow]]
slow++
}
fast ++
}
}
也可以巧用sort方法
code2:
var moveZeroes = function (nums) {
nums.sort((a, b) => {
// 如果两个元素都是 非0 或者都是 0,保持相对位置不变,减小操作次数
if ((a && b) || (a===0 && b===0)) return 0
// 如果前面是 0 后面是 非0,返回 1,保证 非0 在前,0 在后
if (a===0 && b) return 1
// 如果前面是 非0 后面是 0,返回 -1,保证 非0 在前,0 在后
return -1
})
}