【我也想刷穿 LeetCode啊】1089. 复写零

63 阅读1分钟

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

现在前端很多岗位面试需要有一定的算法基础,或者说经常刷算法的会优先考虑。

因此每天刷刷LeetCode非常有必要

在这之前我也刷过一些算法题,也希望以后也坚持刷,跟某掘友一样,我也想刷穿 LeetCode

一、题目描述

给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。

要求:请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

 

示例 1:

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

示例 2:

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

提示:

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

来源:力扣(LeetCode) 链接:leetcode.cn/problems/du… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析

要添加0在数组里嘛,那数组元素肯定要后移,我们就算一下要移动多少位removeCount,

也就是算一下符合条件的0有多少,符合条件的0也就是当前0的下标加上移动的位数不超过数组长度,这个0就符合条件,移动位数就加1。

遍历一遍,算出全部的移动位数之后,我们就可以从后往前遍历,让当前元素等于 下标减去移动位数位置的元素i-removeCount,如果i-removeCount位置的元素等于0 的话,则让i-1下标位置的元素也等于0,这时removeCount要--,i要--因为少了一个 移动位置的0,上一个位置多了一个0。

要特别注意的是,arr[len-1-removeCount]这个位置等于0的话有两种情况,这个0算在移动位数 里面,这个0不算在移动位数里面,要知道算不算在里面,我就用了一个set来装所有移动位数0的下 标,根据这个来判断。

三、代码实现

        /**
        * @param {number[]} arr
        * @return {void} Do not return anything, modify arr in-place instead.
        */
        var duplicateZeros = function(arr) {
            let len = arr.length;
            let removeCount = 0;
            let set = new Set();
            for(let i=0; i<len; i++){
                if(arr[i] == 0){
                    if(i+removeCount < len-1){
                        removeCount++;
                        set.add(i);
                    }
                }
            }
            for(let i=len-1; i>=0; i--){
                if(removeCount>0){
                    arr[i] = arr[i-removeCount];
                    if(arr[i-removeCount] == 0  && set.has(i-removeCount)){
                        arr[i-1] = 0;
                        removeCount--;
                        i--;
                    }
                }else {
                    break;
                }
            }
        };


四、总结

以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~