力扣复写零题解思路

99 阅读1分钟

这里是大熊,新人新报道,第一次发文,有些羞涩。以后的日子还得需要家人们的支持呐~

准备开始刷刷力扣(希望自己可以坚持下),开拓自己的思维能力,接下来分享一下复写零官方题解的思路。巩固一下自己,开冲!!!

原题传送门:leetcode.cn/problems/du…

废话不多说,进入正题。

  • 我们会定义一个新长度来模拟复写后数组的长度
  • 还需要一个记录当前元素下标的变量和数组的最后一个下标的变量
  • 当复写数组的长度 < 数组长度,我们需要移动下标,若当前元素的值是0时,我们需要将复写数组的长度递增2,其他情况都是递增1
  const l = arr.length // 数组长度
  let newLength = 0 // 复写后数组的长度
  let i = -1 // 当前元素的下标
  let j = l - 1 // 数组最后一个下标
  
  while (newLength < l) {
    arr[++i] !== 0 ? newLength++ : (newLength += 2)
  }
  • 当复写后数组的长度刚好是原数组的长度+1时,我们可以理解为此时的元素刚好是0,所以newLength会+2,就刚好是原数组的长度+1啦。这时我们只需要将原数组最后一个元素直接修改为0,并移动下标。
  • 将原数组从后往前开始替换新值,每轮替换完成后将数组位置往前移动,若刚好当前元素是0,就继续将元素赋值为0,然后继续往前移动,最后再移动当前元素的下标。
  if (top === l + 1) {
    arr[j--] = 0
    i--
  }
  while (j >= 0) {
    arr[j--] = arr[i]
    arr[i] === 0 && (arr[j--] = 0)
    i--
  }

言语表达可能不好,但是作为小菜鸡的我就想单纯的记录一下,有错误还请大佬指正!