每日一题leetcode1089—复写零给你一个长度固定的整数数组 `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]解法一:双指针先找到最后一个需要写进数组的元素,然后从后往前按照条件写,注意处理特殊情况——越界时间复杂度:O(n)空间复杂度:O(1) void duplicateZeros(vector<int>& arr) { //1.查找最后一个写的元素 int cur = -1, dest = -1; int sz = arr.size(); while (cur < sz) { if (arr[++cur]) dest++; else dest += 2; if(dest >= sz - 1) break; } //2.处理特殊情况——dest越界 if (dest == sz) { arr[--dest] = 0; cur--; dest--; } //3.从后往前复写 while (cur >= 0) { if(arr[cur]) arr[dest--] = arr[cur--]; else { arr[dest--] = 0; arr[dest--] = 0; cur--; } } }