1089. 复写零 - 力扣(LeetCode)
思路:
- 首先找到最后一个复写的数:
双指针算法:
1、先判断 cur 位置上的值
2、然后决定 dest 移动一步还是两步
3、然后判断 dest 是否到终点了
4、最后 cur ++
- 处理越界的情况
arr[n-1] = 0
cur--
dest -= 2
- 从后往前开始复写
代码:
public void duplicateZeros(int[] arr) {
int cur = 0;
int dest = -1;
int n = arr.length;
//找到最后一个复写的数字
while(cur < n){
if(arr[cur] != 0){
dest++;
}else{
dest += 2;
}
if(dest >= n-1){
break;
}else{
cur++;
}
}
//判断越界的情况
if(dest == n){
arr[n - 1] = 0;
cur--;
dest -= 2;
}
//从后往前开始复写
while(cur >= 0){
if(arr[cur] != 0){
arr[dest--] = arr[cur--];
}else{
arr[dest--] = 0;
arr[dest--] = 0;
cur--;
}
}
}