持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}
}
};
四、总结
以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~