题目
🔗题目链接:283. 移动零 - 力扣(LeetCode)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示:
1 <= nums.length <= 104-231 <= nums[i] <= 231 - 1
进阶: 你能尽量减少完成的操作次数吗?
思路
双指针
- 快慢指针遍历。将数组内非0的元素移动到数组前面,然后从slow的位置向后走,同时把每一项都赋值为0.
- 快慢指针遍历。将fast指针指到的非0元素与slow指针指到0元素交换,因为数组是已经排过序的,所以在从前往后的遍历过程中可以放心大胆地交换元素。
代码
思路一
function moveZeroes(nums: number[]): void {
const lens = nums.length;
let slow = 0;
let fast = 0;
while (fast < lens) {
if (0 === nums[fast]) {
fast++;
} else {
nums[slow] = nums[fast];
slow++;
fast++;
}
}
while (slow < lens) {
nums[slow] = 0;
slow++;
}
}
思路二(这个只需要进行一次遍历,进行的操作更少)
function moveZeroes(nums: number[]): void {
const lens = nums.length;
let slow = 0;
let fast = 0;
while (fast < lens) {
if (0 === nums[fast]) {
fast++;
} else {
[nums[slow], nums[fast]] = [nums[fast], nums[slow]];
slow++;
fast++;
}
}
}