代码拉取完成,页面将自动刷新
class Solution {
public:
void duplicateZeros(vector<int>& arr)
{
//采用双指针的方式从前往后进行复习的话,在进行0的两次复写时,会覆盖掉后面的元素,正难则反,采用从后往前进行复习
//首先,先计算出复写的最后一个元素,为src
//最后一个元素为dest
//持续把src的元素复写道dest
int n = arr.size();
int src = 0, dest = -1;
while (src < n)
{
if (arr[src] == 0)
dest += 2;
else
dest += 1;
if (dest >= n - 1)//注意这里要是满足情况了,就要break,不然++src会导致src来到最后一个复写元素的后面
break;
++src;
}
if (dest == n)//当arr[src] == 0时,但是dest = n - 1,那么为导致复写两个0,造成dest = n而越界
{
arr[n - 1] = 0;
dest -= 2;
src -= 1;;
}
while (src >= 0 && dest >= 0)
{
if (arr[src] != 0)
{
arr[dest] = arr[src];
}
else
{
arr[dest] = 0;
--dest;
arr[dest] = 0;
}
--src;
--dest;
}
}
};
/*
给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。
示例 1:
输入:arr = [1,0,2,3,0,4,5,0]
输出:[1,0,0,2,3,0,0,4]
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]
*/
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。