复写零

116 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

题目描述

给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。 注意:请不要在超过该数组长度的位置写入元素。 要求:请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。 来源:力扣(LeetCode)

  • 示例1
输入: [1,0,2,3,0,4,5,0]
输出: null
解释: 调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]
  • 示例
输入: [1,2,3]
输出: null
解释: 调用函数后,输入的数组将被修改为:[1,2,3]

提示:

  1. 1 <= arr.length <= 10000
  2. 0 <= arr[i] <= 9

思路分析

根据题意可知,在一个给定的数组中,凡是遇到0,就将0复制一个,放在原本0的后面,这样就是让0后面的所有元素都后移一步;而且,原数组也会因为增加了元素而使原数组的长度增大,这样就不符合题意了;
先将数组的长度leng储存起来,后面将会用到;在处理数据时遇到数组之类的,一般都需要取到数组的每一个元素,所以就需要将数组遍历一遍;在遍历项中遇到等于0的时候就在其后面添加一个0,此时原数组已经被改变了,多了一个元素,相应此时的遍历项应该要往后移一为,所以i要加1,这样才不会重复遍历到;等到数组完全被遍历结束后,原数组的长度也变长了,多了res.length - leng 个,所以要将多出来的几个元素全部都删除掉。

AC代码

let nums = [1,0,2,3,0,4,5,0];

function solution(res) {
    const len = res.length;
    for(let i=0; i<res.length; i++) {
        if(res[i] === 0) {
            res.splice(i, 0, 0);
            i++
        }
    }
    if(res.length != len) {
        res.splice(len-res.length);
    }
    console.log(res);
}
solution(nums);