问题链接
1089. 复写零
问题描述
给你一个长度固定的整数数组 arr
,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
注意:请不要在超过该数组长度的位置写入元素。
要求:请对输入的数组 就地
进行上述修改,不要从函数返回任何东西。
示例
示例1
输入:[1,0,2,3,0,4,5,0]
输出:null
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]
解题思路
如果不限制“就地”的话,可以直接用栈来解决这个问题。
思路:统计0的个数后移位
遍历一次数组,统计0的个数;再从后往前遍历一次,根据当前位置左边的0的个数移动当前整数的位置。
代码示例(JAVA)
class Solution {
public void duplicateZeros(int[] arr) {
// 统计0的个数
int countZero = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
countZero++;
}
}
if (countZero == 0) {
return;
}
// 循环中的countZero可理解为当前位置左边h还有多少个0
for (int i = arr.length - 1; i >= 0 && countZero > 0; i--) {
if (arr[i] == 0) {
countZero--;
}
if (i + countZero < arr.length) {
arr[i + countZero] = arr[i];
// 如果是0,复写
if (arr[i] == 0 && i + countZero + 1 < arr.length) {
arr[i + countZero + 1] = 0;
}
}
}
}
}
执行结果
网友评论