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++; } }