JS_LeetCode04:移动零

image-20250512234008685

4.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

双指针

属于一种算法技巧,使用两个变量(指针)来同时在一个数组或者字符串上操作,达到高效解决问题的目的。

在这道题,使用快指针去遍历数组,慢指针负责做非零区域的边界,也就是指向最后一个非零数的下一个位置,准备存放新的非零数。这样的话,快指针找到了非零的数,就可以直接与慢指针交换数据。还可以使用复制,将快指针找到的非零数据复制给慢指针,最后把慢指针后面的数字都置为0就可以了。

? 为什么不能遍历分开存放非零和零的数组

题目要求不能复制数组!

双指针在原地操作,不额外申请空间,而且每个元素最多处理一次,效率高!

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function![image-20250512233957716](C:/Users/An/AppData/Roaming/Typora/typora-user-images/image-20250512233957716.png)(nums) {
let left = 0
let right = 0
while(right < nums.length){
if(nums[right] !== 0){
[nums[left],nums[right]] = [nums[right],nums[left]]
left++
}
right++
}
return nums
};