[双指针] 2. 力扣--复写零

一. 题目描述

二. 解题思路

这种题对下标的掌控极易出错,所以一定要画图,掌握边界情况。

1)首先大思路上我们用的是双指针,一个cur指针遍历数组,另一个dest指针修改数组、复写零。

2)因为要求就地修改,所以一定不能从前往后遍历修改,否则只要出现一个被复写的零就会覆盖下一个值,这很容易看出来。

3)既然不能从前往后,我们可以从后往前。

三. 代码实现

cpp 复制代码
class Solution 
{
public:
    void duplicateZeros(vector<int>& arr) 
    {
        int cur = -1, dest = -1;
        // arr.size()返回size_t类型,与int类型的dest比较时发生类型提升
        // int->size_t,-1->无符号整型的最大值,不会进入第一个循环
        // 所以拿出来隐式类型转换一下
        int n = arr.size()-1; 
        // 1. 遍历找到正常复写结束时,cur和dest的位置
        while(dest < n)
        {
            cur++;
            if(arr[cur] != 0) dest += 1;
            else dest += 2;
        }
        // 如果倒数第二个数是0,dest会到arr.size()的位置
        // 此时如果直接执行arr[dest] = 0;属于越界访问,先处理一下
        if (dest > n)
        {
            dest--;
            arr[dest--] = 0;
            cur--;
        }

        // 从后往前复写
        while(cur >= 0)
        {
            if(arr[cur] != 0) arr[dest--] = arr[cur--];
            else
            {
                arr[dest] = 0;
                arr[dest-1] = 0;
                dest -= 2;
                cur--;
            }
        }
    }
};
相关推荐
:-)1 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
Jerry5 小时前
LeetCode 101. 对称二叉树
算法
可编程芯片开发6 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星6 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮6 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home84076 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>7 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
To_OC7 小时前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC8 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师8 小时前
每条推荐都很准,为什么我还是越刷越无聊?
算法