千万不要被这道题标注着“简单”迷惑了,实际上需要注意的细节很多。
题目描述:
解题思路:
正序遍历,确定结果数组的最后一个元素所在的位置;知道最后一个元素的位置后倒序进行填充。
- 先找到最后一个需要复写的数
- 先判断cur位置的值
- 决定dest向后移动一步还是两步
- 判断dest是否已经到结束位置
- cur++
- 处理边界情况(dest超过arr.size()-1的情况)
- 从后向前完成复写的操作
代码:
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
int cur = 0;
int dest = -1;
while(cur < arr.size())
{
if(arr[cur] == 0)
{
dest += 2;
}
else
{
dest++;
}
if(dest >= arr.size() - 1)
{
break;
}
cur++;
}
if(dest > arr.size() - 1)
{
arr[arr.size() - 1] = 0;
cur--;
dest -= 2;
}
while(cur >= 0)
{
if(arr[cur] != 0)
{
arr[dest] = arr[cur];
dest--;
cur--;
}
else
{
arr[dest] = 0;
arr[dest - 1] = 0;
cur--;
dest -= 2;
}
}
}
};