双指针(5)—复写零
文章目录
- 题目解析
- 方法一:双指针
- 附Java代码
力扣题目:复写零
题目解析
方法一:双指针
算法思路:
[1,0,0,2,3,0,0,4]
如果「从前向后」进⾏原地复写操作的话,由于
0
的出现会复写两次,导致没有复写的数「被覆
盖掉」。因此我们选择「从后往前」的复写策略。
但是「从后向前」复写的时候,我们需要找到「最后⼀个复写的数」,因此我们的⼤体流程分两
步:
i. 先找到最后⼀个复写的数;
ii. 然后从后向前进⾏复写操作。
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
int n = arr.size();
int top = 0;
int i = -1;
while (top < n) {
i++;
if (arr[i] != 0) {
top++;
} else {
top += 2;
}
}
int j = n - 1;
if (top == n + 1) {
arr[j] = 0;
j--;
i--;
}
while (j >= 0) {
arr[j] = arr[i];
j--;
if (!arr[i]) {
arr[j] = arr[i];
j--;
}
i--;
}
}
};
附Java代码
class Solution {
public void duplicateZeros(int[] arr) {
int n = arr.length;
int top = 0;
int i = -1;
while (top < n) {
i++;
if (arr[i] != 0) {
top++;
} else {
top += 2;
}
}
int j = n - 1;
if (top == n + 1) {
arr[j] = 0;
j--;
i--;
}
while (j >= 0) {
arr[j] = arr[i];
j--;
if (arr[i] == 0) {
arr[j] = arr[i];
j--;
}
i--;
}
}
}