Leetcode每日刷题之 1089. 复写零(C++)

1. 题目解析

由题目可知,我们需要将给定数组中的所有零复写一遍,并且保证不能超出数组长度,还不可以开辟新的数组,要在原数组的位置直接操作

2. 算法原理

1. 由题目我们可以将问题简化为找出最终复写完成数组的最后一个元素,然后从该元素由后 向前在原数组依次复写遇到的零元素即可

2. 所以我们首先的目标就是找出复写完成后的数组最后的一个元素是什么,那么我们可以使 用双指针的方法,即一个为快指针一个为慢指针, cur 从头开始作为慢指针向后遍历, dest 作为快指针由 - 1 位置开始向后遍历,当 cur 指针遇见非零元素则两个指针都向后移 一步,如果 cur 指针遇见了零元素,那么就将 cur 元素向后移一步,将 dest 指针向后移 两步,直到 dest 指向数组的末尾,那么这时的 cur 指针指向的元素就是复写后的数组的 最后一个元素

3. 当然需要注意不可以越,界访问,即当 dest 指针指向了数组末尾的下一个位置,这时就 不能直接对 dest 指针指向的区域操作赋值,所以我们可以直接将数组末尾元素赋值为0, 然后根据 cur 指针当前指向的元素进行 dest 指针的移动即可

cpp 复制代码
class Solution 
{
public:
    void duplicateZeros(vector<int>& arr) 
    {
        int cur = 0;
        int dest = -1;
        int n = arr.size();
        //1. 找到最终数组的最后一个元素
        while(cur < n)
        {
            if(arr[cur])
            {
                dest++;
            }
            else
            {
                dest += 2;
            }
            if(dest >= n - 1)
            {
                break;
            }
            cur++;
        }

        //2. 处理越界情况
        if(dest == n)
        {
            arr[n - 1] = 0;
            cur--;
            dest -= 2;
        }

        //3.复写零
        while(cur >= 0)
        {
            if(arr[cur])
            {
                arr[dest--] = arr[cur--];
            }
            else
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }
    }
};

3. 代码实现

相关推荐
萨达大2 分钟前
23种设计模式-模板方法(Template Method)设计模式
java·c++·设计模式·软考·模板方法模式·软件设计师·行为型设计模式
刀鋒偏冷19 分钟前
ninja: error: ‘/opt/homebrew/Cellar/opensslxxx/xx/lib/libssl.dylib
c++
理论最高的吻39 分钟前
98. 验证二叉搜索树【 力扣(LeetCode) 】
数据结构·c++·算法·leetcode·职场和发展·二叉树·c
沈小农学编程44 分钟前
【LeetCode面试150】——202快乐数
c++·python·算法·leetcode·面试·职场和发展
ZZZ_O^O1 小时前
【动态规划-卡特兰数——96.不同的二叉搜索树】
c++·学习·算法·leetcode·动态规划
一只小透明啊啊啊啊1 小时前
Leetcode100子串
算法
木向1 小时前
leetcode:114. 二叉树展开为链表
算法·leetcode·链表
sky_smile_Allen2 小时前
[C#] 关于数组的详细解释以及使用注意点
开发语言·算法·c#
机器视觉知识推荐、就业指导2 小时前
C++设计模式:原型模式(Prototype)
c++·设计模式·原型模式
希望有朝一日能如愿以偿2 小时前
力扣题解(新增道路查询后的最短距离II)
算法