题目传送门
方法一:双指针
我们发现不能从前向后复写,因为会覆盖掉还没有被复写的数据
因此我们需要从后往前复写。
此时left应该指向最后一个被复写的数。
right指向数组最后一个元素
1.找到最后一个被复写的数据。我们用left指向
①先判断left的位置0/非0
②再决定right往后走一步还是两步
③判断一下right是否走到最后
④left++
1.5 处理一下边界条件。
因为第一步完成后.right可能越界
我们手动完成最后一步的复写
2.从后向前。完成复写操作。
①判断arr【left】是否为0.
class Solution {
public void duplicateZeros(int[] arr) {
//我们发现不能从前向后复写,因为会覆盖掉还没有被复写的数据
//因此我们需要从后往前复写。
//此时left应该指向最后一个被复写的数。
//right指向数组最后一个元素
//1.找到最后一个被复写的数据。
//注意right初始化为-1.因为刚开始我们不知道最后一个位置在哪。因此先为-1
//因为只有数组有值,才会被复写。因此先判断arr[left]为0还是非0.
int left = 0,right = -1;
int n = arr.length;
while(left < n){
if(arr[left] == 0){
right += 2;
}else{
right++;
}
if(right >= n-1){
break;
}
left++;
}
//1.5.处理一下边界条件。因为第一步完成后.right可能越界
//我们手动完成最后一步的复写
if(right == n){
arr[n-1] = 0;
right -= 2;
left--;
}
//2.从后往前。完成复写
while(left >= 0){
if(arr[left] == 0){
arr[right--] = 0;
arr[right--] = 0;
left--;
}else{
arr[right--] = arr[left--];
}
}
}
}