这里是大熊,新人新报道,第一次发文,有些羞涩。以后的日子还得需要家人们的支持呐~
准备开始刷刷力扣(希望自己可以坚持下),开拓自己的思维能力,接下来分享一下复写零官方题解的思路。巩固一下自己,开冲!!!
原题传送门: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--
}
言语表达可能不好,但是作为小菜鸡的我就想单纯的记录一下,有错误还请大佬指正!