题目描述
思路
双指针
正常情况下,可以新开一个栈来存储复写零后的数据。但是题目要求原地修改,所以不能这么做。可以使用双指针来分别指向栈顶位置和现在需要放置的元素位置即可。使用top标记栈顶,i标记现在放元素的位置,正着遍历记录一下元素位置,再倒着遍历就可以逐个去掉多余的元素,补充0进入栈。
Python实现
class Solution:
def duplicateZeros(self, arr: List[int]) -> None:
"""
Do not return anything, modify arr in-place instead.
"""
n = len(arr)
top, i = 0, -1
while top < n:
i += 1
top += 1 if arr[i] else 2
j = n-1
if top == n+1:
arr[j] = 0
j -= 1
i -= 1
while j >= 0:
arr[j] = arr[i]
j -= 1
if arr[i] == 0:
arr[j] = arr[i]
j -= 1
i -= 1
Java实现
class Solution {
public void duplicateZeros(int[] arr) {
int n = arr.length, top = 0, 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--;
}
}
}
C++
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
int n = arr.size(), top = 0, 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--;
}
}
};