给你一个长度固定的整数数组 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]
示例 2:
输入:arr = [1,2,3]
输出:[1,2,3]
解释:调用函数后,输入的数组将被修改为:[1,2,3]
提示:
1 <= arr.length <= 104
0 <= arr[i] <= 9
知识点:双指针
解析:
思路1
按照题目要求直接实现,定义两个指针cur和dest,两个指针从零开始,cur用来扫描整个数组。
1.当arr【cur】等于0时,将dest指针移动到cur位置,然后cur加一,从cur位置开始到整个数组结束,元素整体向右移动,最后在cur位置加个0即可。
2.当arr【cur】不等于0时,cur往下走,dest不动。
void duplicateZeros(int* arr, int arrSize) {
int cur=0;
int dest=0;
while(cur<arrSize)
{
if(arr[cur]==0)
{
int end=arrSize-1;
dest=cur;
while(end>dest)
{
arr[end]=arr[end-1];
end--;
}
arr[cur++]=0;
}
cur++;
}
}