Hi 你们好,我是张小猪。欢迎来到『宝宝也能看懂』系列特别篇 - 30-Day LeetCoding Challenge。git
这是一个 leetcode 官方的小活动。能够在官网看到,从 4 月 1 号开始,天天官方会选出一道题,在 24 小时内完成便可得到一点小奖励。虽然奖励彷佛也没什么用,不过做为一个官方的打卡活动,小猪仍是来打一下卡吧,正好做为天天下班回家后的娱乐。github
这里是 4 月 4 号的题,也是题目列表中的第 283 题 -- 『移动零』shell
给定一个数组 nums,编写一个函数将全部 0 移动到数组的末尾,同时保持非零元素的相对顺序。segmentfault
示例:数组
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
说明:函数
EASYspa
这道题的核心要求在于须要作原地的赋值,不然咱们只须要建立一个新数组,而后根据遍历的数值向里 push
便可。指针
为了作到原地,咱们便须要知道 0 值所在的下标位置,以及要替换成什么值。基于这个思路,咱们很容易想到,能够在遍历的过程当中针对值是否为 0 作区分处理。code
基于上面的思路,咱们能够经过两个指针来完整整个数组的遍历。其中一个指针用于单纯的做为下标递增,另一个指针用于标识当前还未被处理的 0 值的位置。blog
对于其它的非 0 值而言,两个指针会同步移动。而遇到 0 的时候,用于特殊标识的指针便停下,直到遍历的指针遇到一个非 0 的值,咱们将两个值的位置进行交换,这样便完成了一次 0 值向下一个非 0 值位置的移动。而咱们后续须要作的只是继续重复这个过程,直到完成遍历。这样全部的 0 值就会被移动到末尾。
具体代码以下:
const moveZeroes = nums => { for (let i = 0, zero = 0; i < nums.length; ++i) { if (nums[zero] === 0 && nums[i] !== 0) { nums[zero] = nums[i]; nums[i] = 0; } nums[zero] !== 0 && ++zero; } };
咱们能够把 nums
数组想象成有两个,一个是原始数组,一个是处理以后的数组。因而咱们用一个值来遍历原始数组,而用另外一个值 idx
来标识数据在处理完以后的数组中的位置。
那么在遍历的过程当中,若是遇到 0 值,则 idx
不进行任何修改,而遇到非 0 值,则将其赋值给 idx
的位置,而且将 idx
进行后移。这样遍历完成后,咱们便处理完了全部非 0 值的正确位置。只须要再将后面的位置所有填充 0 值便可。
具体代码以下:
const moveZeroes = nums => { let idx = 0; for (let i = 0; i < nums.length; ++i) { nums[i] !== 0 && (nums[idx++] = nums[i]); } while (idx < nums.length) nums[idx++] = 0; };
做为『30-Day LeetCoding Challenge』的第四题,仍旧没有什么太多可说的。经过两种思路来进行了分析,但愿能帮到有须要的小伙伴。
若是以为不错的话,记得『三连』哦。小猪爱大家哟~