【初级算法|数组】07-移动零

116 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

问题

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例:

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

分析

第一种解决:将不是 0 都往前转移,如果把非0的往前挪,对数组进行遍历,遇到0时,将后一位往前移动,并记录0位数,然后最后都以 0 补充剩余的。这种是最容易理解也是最容易想到的,代码比较简单。

需要注意临界条件的场景,比如是个空数组或者只有一个元素的数组。

第二种解决:

使用了一个临时数组,将非0数组都 push 到temp里面,然后在补全0;这种方式和第一种其实都是一样的思路,在考虑时间复杂和空间复杂度,额外消费了空间复杂度,所以这种没有第一种有优势。

代码

function func_exerise4(nums) {
    if (nums == null || nums.length == 0)
        return;
    let index = 0;
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] != 0)
            nums[index++] = nums[i];
    }
    while (index < nums.length) {
        nums[index++] = 0;
    }
}

总结

数组类型的题目,主要解决方法:

1、暴力解决:直接通过暴力遍历,遍历每个元素进行解决,并同时增加额外空间进行处理

2、二分法解决:针对的是有序数组且无重复的元素,然后再划分区间,分组解决

3、双指针:主要通过通过一个快指针和慢指针在一个for循环下完成两个for循环的工作

题目来源:leetcode-cn.com/leetbook/re…