当前位置: 首页 > wzjs >正文

郑州怎么做网站排名google play下载官方版

郑州怎么做网站排名,google play下载官方版,2023年时政热点事件,网站服务器有哪些类型有哪些类型有哪些类型有哪些类型有哪些目录 题目描述 题目讲解 算法原理 先打预防针(异地操作) 原理讲解 总结 代码展示 真正开始(就地操作) 就地操作遇见的问题 从前往后操作 解决办法 特殊的从后往前操作 如何确定cur的位置? 总结 代码展示 💫只有认知的突破💫才…

目录

题目描述 

题目讲解

算法原理

先打预防针(异地操作)

原理讲解

总结

 代码展示

真正开始(就地操作)

就地操作遇见的问题

从前往后操作

解决办法

特殊的从后往前操作

如何确定cur的位置?

总结  

 代码展示


💫只有认知的突破💫才来带来真正的成长💫编程技术的学习💫没有捷径💫一起加油💫

           🍁感谢各位的观看🍁欢迎大家留言🍁咱们一起加油🍁努力成为更好的自己🍁

题目描述 

题目:复写零

如图所示的题目描述:

题目讲解

本题目要求的是,对于0元素要进行复写,也就是写2遍,其余元素向后移动,如示例1所示的结果。注意:不允许开辟新的数组,只能就地操作原数组。

算法原理

先打预防针(异地操作)

我们要先有一个思想的过渡期,我们先不考虑就地操作,先考虑异地操作,也就是说先建立一个新数组。

原理讲解

我们先创建一个和原数组空间一样大的新数组num,然后我们定一个指向新数组首元素的指针begin_num如图所示:

同时e依次遍历原数组,当为非0元素时,就插入begin_num指向的空间,然后两者同时向后走一步 - -。当遇到0元素时,就对0元素进行复写,然后两者同时向后走一步- -。当新数组num走到末尾就结束程序。然后再把新数组的数据赋值拷贝给原数组。

总结

1.先创建一个和原数组大小一样的新数组

2.创建一个指向新数组首元素的指针

3.当e指向的元素非0时,就直接拷贝到begin_num指向的空间,然后两者同时向后走一步

4.当e指向的元素为0时,begin_num就直接复写两遍0,复写完之后,两者同时向后走一步

5.把新数组num的数据赋值拷贝给原数组

 代码展示

class Solution {
public:void duplicateZeros(vector<int>& arr) {vector<int>num(arr.size(),1);        //创建一个同样大小空间的新数组auto begin_num=num.begin();        //指向新数组首元素的指针for(auto&e:arr){if(e)        //处理非0元素{*begin_num=e;begin_num++;}else        //处理0元素{num[begin_num++]=0;        //进行复写操作num[begin_num++]=0;}if(begin_num==num.end())    //结束条件由num决定,当begin_num等于num.end()就结束循环break;} arr=num;        //再把新数组的元素拷贝给原数组}
};

真正开始(就地操作)

就地操作遇见的问题

从前往后操作

当我们把异地操作合一起时,就可以用两个指针指向本地数组。我们就定两个指针,cur和dst。cur用来遍历数组,dst用来存储非0元素和0元素。如图所示:

当我们按照异地原理进行操作的时候,这个时候就会出现一个大大的问题前两个数据还能正常的插入,但越往后操作就会发现,这样操作下去就会使后面的所有数据都为0,这明显不对了

解决办法

特殊的从后往前操作

我们从前往后操作行不通,那么我们就从后往前进行操作。当然,我们这里从后往前操作不是两个指针都指向同一个数据,这样的话,就会导致前面的所有数据都为0我们可以观察一下原数组和复写之后的数组,可以让cur指针,指向复写之后的数组的最后一个位置数据,让dst指针指向数组的最后一个位置,因为cur指向的数据是复写数组最后一个数据,肯定是要放在dst指向的位置的,dst就是用来接收cur的数据和进行复写操作的。如图所示:

然后再按照异地的操作原理,就可以完美的解决了。接下来就是解决——如何精确的找到cur的位置呢?dst不用找,它必定指向数组的最后一个位置。关键就是找到cur的位置,因为并不能确定复写数组的最后一个元素是哪个。

如何确定cur的位置?

我们可以从前往后的进行查找cur的位置。让cur指向数组的首元素,即cur=0,让dst指向数组的前面位置,即dst=-1,如图所示:

当遇到非0元素时,dst就往前走一步,然后cur也往前走一步。当遇到0元素时,dst就往前走两步,然后cur往前走一步。结束条件就是dst<n。按照这个方法,就可以完美的找到两个指针该对应的位置,然后就按照异地的原理进行操作,就可以解决了。这种找位置的方法,是完全没问题的。但是在按照异地原理操作的时候,要特殊处理一种情况。比如数据:1,0,3,0,4。我们按照方法找到cur和dst的位置,如图所示:

对于这个例子,我已经找到了各自对应的位置。会发现,dst已经越界了,当我们从dst位置进行复写时,就会发生越界的数据访问,这不代表方法是错误的,这俩指针都正确的指向了各自的位置只不过,我们在进行复写操作的时候,这种情况要特殊处理而且这种情况的出现,也就只有最后一个复写数据为0时才会出现。所以我们进行复写时, 要在[n-1]的位置开始复写,同时dst要往前走两步,然后cur也往前走一步。后面就是正常的复写操作了。   

总结  

1.先从前往后确定cur和dst的位置

2.cur指向数组的首元素位置,dst指向数组之前的位置

3.非0数据,dst就++,然后,cur++。0数据时,dst要走两步,然后cur++,dst<n结束条件

        3.1:当要复写的位置为数据0时,这个时候dst也越界了。在进行复写操作的时候,先进行[n-1]的位置为0,然后dst往前走两步,cur往前走一步。

4.正常进行复写操作

 代码展示

class Solution {
public:void duplicateZeros(vector<int>& arr) {int cur=0,dst=-1,n=arr.size();        //确认cur和dst的起始位置while(cur<n)        //确定cur和dst的复写位置{if(arr[cur])dst++;        //非0数据走一步else dst+=2;            //0数据走两步if(dst>=n-1)break;    //结束条件cur++;}if(dst==n)        //处理特殊情况{arr[--dst]=0;cur--;dst--;}while(cur>=0)        //正常的异地的复写操作{if(arr[cur])swap(arr[cur--],arr[dst--]);else{arr[dst--]=0;arr[dst--]=0;cur--;}}}
};

http://www.dtcms.com/wzjs/178146.html

相关文章:

  • 做关于时尚网站的目的互联网广告销售
  • 怎样新建网站网络营销策略实施的步骤
  • 做网站运营的简历关键词的选取原则
  • 网站设计 开发人员一个完整的产品运营方案
  • 微信网站怎么制作seo网站优化师
  • 南宁做网站的公司有哪些深圳市seo上词贵不贵
  • 兰州网站seo开封网站seo
  • top wang域名做网站好痘痘该如何去除效果好
  • 有几个网站一键免费创建论坛网站
  • 网站建设 考核指标网络推广是做什么工作的
  • 新网站如何做seo优化网页设计与制作软件有哪些
  • 帮客户做网站图片被告侵权青岛专业网站制作
  • 制作购物网站网站seo外包价格
  • 门户网站开发方案文档网络推广运营外包公司
  • 怎么在微信做企业网站网络推广公司哪家好
  • 网站建设属于哪种公司天津网站排名提升
  • 桥南做网站广州百度推广优化排名
  • 拓者设计吧手机版郑州网站优化
  • 微信小程序制作生日快乐网址seo关键词
  • 网站建设内容策划案广告模板
  • 世界500强公司排行榜网站排名优化
  • 大连网站制作怎么做网站关键词免费优化
  • 深圳布吉网站建设企业网站建站模板
  • 微网站设计与开发竞赛搜索引擎优化的技巧有哪些
  • 本地网站建设官网深圳做网站公司
  • 做澳洲外贸的网站百度推广效果怎样
  • 做视频网站代码最好用的搜索神器
  • 怎么知道一个网站是哪家公司做的seo新手快速入门
  • php不用框架怎么做网站网络推广运营团队
  • 建e网室内设计网模型楼梯纯手工seo公司