03_02_leetcode_283_移动零

1、题目描述

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

示例:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.思路

走的歪路:原本打算首尾各设置一个指针,从头到尾遍历数组,遇到零就用尾部非零数据填充,忽略不改变原数组的相对位置################################以后要详细把每个条件写下来

#####

设置双指针,这两个指针都在开头,第一指针遍历数组,若为0,则另一个指针寻找非0数据填补上;若非0,则都前进一个数据

其实就是有一条路,路上有许多坑,小1和小2都从头开始走,小1遇到坑就停下来,直到等到小2搬救兵把他给救出来。因为小2 把救兵搬走了,这个地方就没有救兵了,所以要置空。小2总是要比小1快,所以当小2走到头时,说明所有救兵就没有了。

双指针的作用稍微有点动态,不过满足一个找出不满足的点,一个去不停的的填补不满足的点

3.代码展示

public void moveZeroes(int[] nums) {
        // initial number of numbers
        int i = 0, j = 0;
        while (j < nums.length) {
            if (nums[i] == 0) {
                if (nums[j] != 0) {
                    nums[i] = nums[j];
                    nums[j] = 0;
                    i++;
                }
            } else {
                i++;
            }
            j++;
        }
    }

4.金牌思路

以寻找救兵为目的,直接覆盖,出发点不同,写出的代码不同

public void moveZeroes(int[] nums) {
        // initial number of numbers
        int i = 0, j = 0;
        while (j < nums.length) {
            if (nums[j] != 0) {
                nums[i] = nums[j];
                nums[j] = 0;
                i++;
            }
            j++;

        }
    }
原文地址:https://www.cnblogs.com/xiaoming521/p/14586844.html