题目
算法原理
双指针算法的运用,根据题意可知,最后的数组会被原数组包括,因为0会从一个变成俩个,这样就需要去找到0变为俩个后,哪一个成员会成为变化后的最后一个,就可以用双指针的思路来解决,定义cur和dest,用cur来遍历数组,遇到非零dest加一,需要注意dest初始值为-1,遇到零就加二,cur在遍历条件是dest还在数组范围内,当越界时,cur就停止遍历,cur停下的位置就是变化后的最后一个元素,如果没有超过cur就继续遍历。
然后在反过来再执行一次向前的逻辑,因为由前到后会覆盖值,所以从后往前就不会出现。
此题还需要处理边界情况,就是dest的值可能会在数组外,在力扣上就不行,其它的可能可以通过,处理情况就为手动操作,把最后一个元素置零,然后dest减去二,cur--就可以按照向前的逻辑继续执行。
代码实现
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
int dest=-1,cur=0;
while(cur<arr.size())
{
if(arr[cur])
{
dest++;
}
else
{
dest+=2;
}
//cur++;这里会报错,因为要保证dest没有超过才可以加cur,不然超过了还加不就不是正确的终止位
if(dest >=arr.size()-1)
{
break;
}
cur++;
}
if(dest==arr.size())
{
arr[arr.size()-1]=0;
cur--;dest-=2;
}
while(cur>=0)
{
if(arr[cur])
{
arr[dest--]=arr[cur--];
}
else{
arr[dest--]=0;
arr[dest--]=0;//因为遇到0要重复俩遍
cur--;
}
}
}
};