[宝宝也能看懂的活动篇][30-Day LeetCoding Challenge] 第四天

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]

说明:函数

  1. 必须在原数组上操做,不能拷贝额外的数组。
  2. 尽可能减小操做次数。

官方难度

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』的第四题,仍旧没有什么太多可说的。经过两种思路来进行了分析,但愿能帮到有须要的小伙伴。

若是以为不错的话,记得『三连』哦。小猪爱大家哟~

相关连接

qrcode_green.jpeg

相关文章
相关标签/搜索