来源:力扣(LeetCode)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
方法一:快慢双指针
- 快慢指针都从0开始
- 当用快指针指向的值不为0时,与慢指针交换值
- 慢指针负责指向值为0的元素
<img src="https://pic2.zhimg.com/80/v2-b2d79135af42333c82dc342b14c7ec49_720w.png" alt="img" style="zoom:80%;" />
var moveZeroes = function(nums) {
let n = nums.length;
let slow = fast = 0
while(fast < n) {
if (nums[fast] !== 0) {
[nums[slow], nums[fast]] = [nums[fast], nums[slow]]
slow++
}
fast++
}
return nums
};
- 时间复杂度:
O(n)
- 空间复杂度:
O(1)
方法二:
- 变量
j
负责记录非0元素的个数 - 判断当前元素是否为0,不为0时,令下标为
j
的元素等于当前元素 - 最后的结果是所有非0的数都往前移动了,剩下的元素全部赋值0
var moveZeroes = function(nums) {
let j = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] != 0)
nums[j++] = nums[i];
}
for (let i = j; i < nums.length; i++) {
nums[i] = 0
}
return nums
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。