持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情
题目(Move Zeroes)
链接:leetcode-cn.com/problems/mo… 解决数:5532 通过率:64% 标签:数组 双指针 相关公司:facebook amazon microsoft 给定一个数组 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
进阶:你能尽量减少完成的操作次数吗?
思路1,双指针交换
- 指针 、 初始指向索引 0
- 指针 指向提供给非 0 项的坑位
- 指针 推进找非 0 项,想交换到 指向的坑位
var moveZeroes = function (nums) {
let i = 0, j = 0;
while (i < nums.length) {
if (nums[i] != 0) {
[nums[i], nums[j]] = [nums[j], nums[i]];
i++;
j++;
} else {
i++;
}
}
};
思路2,非 0 项覆盖到数组前头
- 将所有非 0 项覆盖到数组的前头,然后将剩下的位置覆盖为 0
- 安排了所有非 0 项,剩下位置就属于 0
- j 指向提供给非 0 项的坑位
var moveZeroes = function (nums) {
let j = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] != 0) { // 遇到非0项
nums[j] = nums[i]; // 覆盖到j上
j++; // j后移
}
}
for (let i = j; i < nums.length; i++) { // 剩下的位置赋为0
nums[i] = 0;
}
};
思路3
- 利用快慢指针,快指针指向的元素如果不等于0的话,放把它放到前面来,也就是放到慢指针所指向的位置,慢指针向后移1位
- 快指针走到数组末尾了,慢指针前面的都是不等于0的元素
- 把慢指针后面的元素都置为0
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function (nums) {
let fast = 0,
slow = 0;
while (fast < nums.length) {
if (nums[fast] != 0) {
nums[slow++] = nums[fast];
}
fast++;
}
while (slow < nums.length) {
nums[slow++] = 0;
}
};
思路4
- 解题思路1在于只把快指针指向的不等于0的元素都移动到慢指针的位置来,其实我们可以进一步想
- 快指针指向的不等于0的元素,把它跟慢指针指向的元素交换
- 当快指针走到末尾的时候,其实已经全部交换完毕了,前面的都是不为0的元素,后面的都是0的元素了
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function (nums) {
let fast = 0,
slow = 0;
while (fast < nums.length) {
if (nums[fast] != 0) {
[nums[fast], nums[slow]] = [nums[slow], nums[fast]];
slow++;
}
fast++;
}
};