首页 > 其他分享 >双指针练习:复写0

双指针练习:复写0

时间:2024-06-02 11:30:53浏览次数:13  
标签:arr 位置 cur dest 练习 -- 复写 指针

1.题目链接1089.复写零

2.题目描述:

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

3.解法(原地复写-双指针):

算法思路:

如果「从前往后」进行原地复写操作的话,由于0的出现会复习两次,导致没有复写的数「被覆盖掉」,因此我们选择「从后往前」的复写策略。

但是「从后往前」复写的时候,我们需要找到「最后一个复写的数」,因此我们的大体流程分为两步:

a.先找到最后一个复写的数;

b.然后从后往前进行复写操作。

算法流程:

1.初始化两个指针 cur = 0,dest = 0;

2.找到最后一个复写的数

        a.当 cur < n 的时候,一直执行下面循环:

                (1)判断cur位置的元素:

                        ·如果是0的话,dest++

                        ·否则dest++

                (2)判断dest时候是否已经到结束位置,如果结束就终止循环;

                (3)如果没有结束,cur++,继续判断

3.判断dest是否越界到n位置:

        a.如果越界:执行下面三步:

                ·n-1 位置值修改为0;

                ·cur 向后移动一步;

                ·dest 向前移动两步;

                (越界的原因是因为cur 位置为0,des+=2 ,越界了一位,修改了一位数组以外的数据为0,即非法访问,因此,此时我们只需要修改一个dest为0就可以了,因此先手动修改arr[n-1] = 0 ,此时cur当前指的0也就我们手动修改过了,因此cur--,dest-=2)

4.从cur位置开始往前遍历原数组,依次还原出复写后的结果数组:

        a.判断cur位置的值:

                ·如果是0,dest以及dest -1位置修改成0,dest-=2;

                ·如果非0,dest位置的数据 = cur位置的数据,dest--;

        b.cur--,复写下一个位置

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int cur = 0, dest = -1, n = arr.size();
        //先找到最后一个数
        while(cur < n){
            if(arr[cur]) dest++;
            else dest+=2;
            if(dest >= n-1) break;
            cur++;
        }

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

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

};

 

标签:arr,位置,cur,dest,练习,--,复写,指针
From: https://blog.csdn.net/2202_75331338/article/details/139349728

相关文章

  • C语言练习题之——从简单到烧脑(13)(每日两道)
    打印爱心1.1:普通输出爱心#include<stdio.h>intmain(){ printf("******************\n");//7(代表边上的空格) printf("******************************\n");//4 printf("************************************\n&quo......
  • 指针的详解延续二
     第一篇移步CSDNhttps://mp.csdn.net/mp_blog/creation/editor/139301675 第二篇移步CSDN​​​​​​​​​​​https://mp.csdn.net/mp_blog/creation/editor/139329194目录一、指针数组二、字符指针变量三、数组指针变量四、二维数组传参的本质五、函数指针变量 ......
  • 螺旋矩阵练习
    59.螺旋矩阵II题目介绍:给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的nxn正方形矩阵matrix。示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]]示例2:输入:n=1输出:[[1]]提示:1<=n<=20思路:本题主要就是模拟螺旋......
  • 动手学深度学习4.6 暂退法-笔记&练习(PyTorch)
    以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。本节课程地址:丢弃法_哔哩哔哩_bilibili本节教材地址:4.6.暂退法(Dropout)—动手学深度学习2.0.0documentation(d2l.ai)本节开源代码:...>d2l-zh>pytorch>chapter......
  • 旅行第五天【算法】双指针-----三数之和+四数之和
    文章目录一、题目二、算法原理三、编写代码四、题目五、算法原理六、编写代码一、题目链接:三数之和二、算法原理首先是解法一:暴力解法(其实有必要思考一下,不用把程序写出来,写伪代码就可以了,因为优化后算法的代码是建立在暴力解法的基础上的)三个指针,分别依次......
  • C++Primer Plus第十一章类的使用,课后练习2,还是醉汉回家的故事 3,最慢和最快及平均概率
    修改程序清单11.15,使之报告N次测试中的最高、最低和平均步数(其中N是用户输入的整数)而不是报告每次测试的结果。头文件和实现文件不变,这里为大家方便还是贴上代码//vect.h--Vectorclasswith<<,modestate#if1#ifndef VECTOR_H_ #defineVECTOR_H_#include<io......
  • C++Primer Plus第十一章类的使用,课后练习1,还是醉汉回家的故事
    编程练习11.91.修改程序清单11.5,使之将一系列连续的随机漫步者位置写入到文件中。对于每个位置,用步号进行标示。另外,让该程序将初始条件(目标距离和步长)以及结果小结写入到该文件中。该文件的内容与下面类似:TargetDistance:100,stepSize:200:(xy)=(0,0)1:(x,y)=(-11.4......
  • 深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
    在本篇文章中,我们将详细解读力扣第170题“两数之和III-数据结构设计”。通过学习本篇文章,读者将掌握如何设计一个数据结构来支持两种操作,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释和ASCII图解,以便于理解。问题描述力扣第170题“两数之和III......
  • 【C/C++】--- 指针详解 2.0
    接下来进入指针的进阶部分,准备好大脑补充:(重点)数组名是数组首元素地址数组首元素地址和数组地址,值相同,但本质不同,区别在于二者的类型不相同比如数组intarr[10];数组首元素地址的类型:首先这是一个地址所以要用指针接收,(),然后是地址指向元素的类型为int,所以这个指针的......
  • matlab练习程序(LQR路径跟踪)
    LQR是一种优化控制方法,设计目标是找到一组控制输入,使得线性系统的状态轨迹尽可能地接近目标,同时使控制输入尽可能小。其目标函数是一个二次型成本函数。分为以下几个步骤:1.设系统动态方程为:其中x为状态量,u为控制输入,A和B为状态转移和控制矩阵。2.定义一个性能指标,即控制器......