leetcode top100挑战, 每天不鸽一道题之 移动零(14/100)

230 阅读2分钟

这是我参与更文挑战的第26天,活动详情查看: 更文挑战

题目描述

移动零

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

leetcode-cn.com/problems/re…

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。

标签

双指针

解题分析

1. 双指针

直接上讲解。

定义两个指针,快指针、慢指针。
快指针用于遍历判断元素是否是0。
如果不是0,将其值给到慢指针指向的元素,慢指针右移。
若是0则不作操作。
快指针遍历完成后,所有不是0的元素都被赋值到数组的前面,
从慢指针的位置开始,数组后面的数都设置为0即可。

很简单,我们先创建快慢指针。
快指针用来遍历数组
慢指针用来保存不为0的值

快指针遍历每一个元素时,会判断是否为0,如果不为0,那就把这个元素扔到慢指针的位置,接着移动慢指针。

例如:
[1,2,0,4,6]

1 不为0 那就放到第一个 [1]
慢指针++
2 不为0 那就放到第二个 [1,2]
慢指针++
00, 那就不管他    [1,2]
4 不为0 那就放到第三个 [1,2,4]
6 不为0 那就放到第四个 [1,2,4,6]

快指针遍历结束。

拿到新的数组[1,2,4,6],并且用慢指针来给数组添加0 
最终得到结果。
[1,2,4,6,0]

来人上代码!!!!!

/**
 Do not return anything, modify nums in-place instead.
 */
function moveZeroes(nums: number[]): void {
    // 创建快慢指针来记录
    let index = 0;
    for (let i = 0; i < nums.length; i++) {
        // 如果当前的元素不是0,把元素指向到慢指针index上,是0就不用管
        if (nums[i] !== 0) {
            nums[index] = nums[i];
            index++;
        }
    }
    // 把慢指针后面的值都变为0
    for (let i = index; i < nums.length; i++) {
        nums[i] = 0;
    }
};

另外记一个厉害老哥的写法。

/**
 Do not return anything, modify nums in-place instead.
 */
function moveZeroes(nums: number[]): void {
    nums.sort((a,b) => b? 0: -1)
};

image.png

最后

从今天开始不鸽,每天一道算法题并发布文章,首先想要解决的题组为Top100,第十四道题目打完收工!!