题目
给你一个长度固定的整数数组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]
- 难度:Easy
这里做题
思路
- 如果不要求原地修改数组,那么就可以用栈
- 正向覆盖会导致数组后面的内容被修改,因此考虑反向覆盖
- 先正向扫描数组,统计出0的个数
cnt0
- 反向扫描数组,移动元素位置。其中每个元素需要往后移动它左边0的个数个位置;如果这个数是0,那么还需要在它后面补一个0
代码
class Solution {
public void duplicateZeros(int[] arr) {
int cnt0 = 0;
int len = arr.length;
// 统计0的个数
for(int a : arr){
cnt0 += a == 0 ? 1 : 0;
}
// 反向遍历修改
for(int i = len-1; i >= 0; --i){
// 碰到0就减1,即为左边的0个数
if(arr[i] == 0) -- cnt0;
// 右移cnt0位
if(i+cnt0 < len) arr[i+cnt0] = arr[i];
if(arr[i] == 0 && i+cnt0+1<len) arr[i+cnt0+1] = arr[i];
}
}
}