00:00
好,那么这块呢,我们关于这个题目呢,咱们就告一段落啊,接着来看这个练习五啊,练习五这块呢,我们来考虑一下叫数组元素的一个反转的操作,比如说那现在我们定了一个数组,这个数组呢长这样说,现在呢,我希望呢,把这个数组元素呢做一个反转。诶反转呢,就意意味着呃,像这个34呢,跟这个67呢,他俩得交换一下是吧。呃,然后呢,整个这块呢,都得有个交换,最终呢效果呢,希望呢就是67,完了以后是这个34,然后呢,76是在这儿,以此类推,然后最后呢是诶54,然后34啊这样一个效果。整个呢,把这个元素呢,给它反着来一次啊行,那你想想我们怎么去做这个事啊。嗯,怎么实现呢?哎,其实这里边儿,你看我们第一个元素在这,最后一个在这儿是吧。你希望呢,他变成第一个,这个呢,希望变成最后一个。是不是就把它俩交换一下,是不是就行。对,那一次呢,我们第二个元素跟倒数第二个是不是交换一下。哎,第三个跟倒数第三个,哎这块呢,我在这个课件里边放了一个图啊,给咱们找一下这个反转的事儿,诶你看一下。
01:05
哎,实际上的话呢,我们说就是这样的一个效果嘛。啊,依次依次这样走好,最后这块呢,我们恰好这里边有奇数个元素啊,所以最后这个元素呢,就他自己了,自己跟自己就不用画了。那这样就行是吧,那如果要变成偶数个的话呢,比如我们这是九个元素变成八个了,其实中间这个也就没有了是吧。哎,那就是相邻的这两个再交换一下就可以了。行,那就是我们这样的一个思路,那这个思路呢,核心的这个操作你看啊,我们是第一个跟倒数的。啊,这一个呢做交换,那其实呢,相当于就是A22的角标零,跟我们这个在这个题目当中,是不是LA4减一啊。对,那第二个元素呢。这是角标一了,哎,然后跟这个倒数第二个是不是这就变成减二了。好,那其实我们要是写成一个公式的话呢,就是ARI是吧,与A2啊,点Les减一减I这个位置上元素呢,做一个交换就可以了。
02:03
能理解是吧,哎,这就是咱们这个核心的这个操作行,那这个呢,要把握清楚以后呢,哎,回过来这个题目呢,我们就可以去完成了啊。哎,瑞的一个啊,EX1205啊。好,没有方法进来,诶首先这块呢提到了,说我们这个数组呢,就长这样,那咱们把这个数组呢,就直接呢拿过来了啊CTRLC。诶就声明到这儿了,好,那下边呢,我们对它进行一个反转,哎,刚才这个核心的思路呢,咱们其实也已经提到了啊,如果因那个I呢等于零,然后I呢小于,诶这呢是一个核心啊。然后呢,I加加。哎,这呢就决定了我们到底这个呃,反转到什么时候就终止了是吧。哎,那可能我们写的比较顺了,大家上来就这样写了。这样写你得考虑。行不行啊。对,其实是有点问题的是吧。嗯,对,我先这样写了啊,咱们或者说你先等一下,我们考虑这个事儿,你想核心的这个操作呢,是我们要交换两个位置的元素,哪俩位置呢?诶我们刚才已经看到了啊,就是这个ari和我们这个a.lengths减一减I这个位置元素,行,那这块我们就直接做这个交换了哈,那我就首先in特一个啊,这是一个ta的一个值,这个值呢,我们让它呢是ariri是吧。
03:16
呃,然后呢,接着这个ari。哎,等于,哎,我们刚才呢,提到的是跟它对应的那个元素减一,再减去个I。哎,这样啊,然后呢,再把刚才这个变量呢,写一下叫length呢,减一减I。哎,让他呢,再拿我们这个tap呢做个赋值,好这呢就是交换我们两个位置的元素,把这写啊。来交换我们这个ari。与。AR。啊,点less呢,减一减I是吧,哎,这个位置的元素。好,那这呢,我就把它俩呢交换了,然后呢,A加加,那就是下一个元素,OK,那整个呢,这样我们就把这个操作呢,就执行完了,执行完以后的话呢,我们这块呢,做一个便利啊。
04:06
哎,便利看一下这时候呢,是不是哎能交换啊a2.less。来打印一下。诶,同学说这个好像不太靠谱是吧。来提一下啊好,这个呢,是我们做了一个反转之后的一个便利啊。反转操作,然后呢,我们把它呢,CTRLC一下啊,在反转之前咱们也去便利一下,然后呢,换一下行,看一看靠不靠谱走起。好,这个呢是之前的,这个呢是之后的,你发现呢,完全没变啊。那是因为我们这个化学完没进去吗?进去了,只不过呢,这个反转呢,给整过了是吧。嗯,对,实际呢,你要是跑一下这个程序呢,你会发现呢,它其实经过了我们刚才说的这样的一个交换啊,只不过呢,就是你这个I呢,呃,等于三之后啊,你跟这个五的这个位置呢,做了个交换,接着呢变成四了,它自己交换了一下,接着I又加加了四已经在这儿又在这儿了,结果你又把它俩又换回去了,是吧。
05:07
所以呢,最后呢,就白交换了。那这时候我们就要考虑这个终止的条件该怎么去设置的问题了。是吧,你看啊,我现在呢,这个是有九个元素是吧,角标零到八,这有九个元素,咱就用点length来表示吧。那我们这个终止条件呢,咱们尽可能的往LS这块去靠,是吧,你说是这个ar.las怎么着作为这个终止条件。这有九个元啊,这有九个元素,九个元素的话呢,我们要九除以二的话呢,是四点几就是四倍。哎,这个四的话呢,你看。四的话,要不要取到这个四呢。咱们现在考虑是角标是吧,哎,这个四的话呢,其实不用取,相当于是让I呢小于ar.las除以二是吧。对吧,好,那么回过来,我把这个位置呢,就这样改一下。
06:03
嗯,改我们的这个位置哈,直接呢,在这个位置我们就来一个除以二。哎,这样就可以了。那这个有同学可能会担心,诶,你看你刚才这个举例的话呢,我们这有奇数个数啊。那要有偶数个数的话呢,是不是也同样的道理呢?可能会有这个担心,来,我们简单的比如再模拟一个哈。比如这块我们这样画。哎,这样啊,我这儿呢,是有八个元素。哎,八个元素哈,那这个点length呢,是不是就八呀。那八除以二呢?也是四,那我这个让I呢,还是小于这个四的,其实角标就到三了吧,角标到三,那这角标0123。哎,正好到这儿,然后呢,这个是。呃,4567是吧,然后这时候呢,你这个这是跟它这个呢,跟他这个呢,跟我们这个这个三跟四正好这块不也是满足的是吧,也就不管你这个长度呢,是奇数还是偶数呢,这个式子呢,都是可以满足的。诶,我们就这样写没问题,好,这时候我们再来一个run。
07:04
哎,这时候呢,你会发现呢,我们这个整个呢,就给它交换过来了。哎,所以这呢,就是我们的一个反转的一个操作。哎,没问题啊好,那么除了这个操作方式之外呢,你想想还没有别的方式。啊,定义两个变量是吗。另一个数组。啊对,可以,这也是一种方式是吧,哎,他这样考虑的啊,说呢,我再定一个新的数组,然后呢,我怎么着啊,是不是倒着便利啊。对,倒热便利的方式呢,把这个新的数组元素呢,都给它复制过去是吧。然后呢,你再把新的数组那个名呢,再附给这个新的这个名就可以了。这个可以没问题是吧,哎,咱们快速的写一下啊,相当于呢,我这块呢,我去印一个数组,我叫AR叫new的一个AR吧。哎,我现在去用这个int数组这个位置我写成叫a2.lengths是吧,然后for循环的方式啊,Int一个I等于怎么着。
08:04
a2.less减一吧,然后I呢。大于等于0I。减减是不是倒着便利嘛,是吧,然后你的这个AR啊,这块你得小心点啊,这个位置怎么写。这块取决于你这块咋写的哈,就是这块你也可以从前往后变离是吧。对,你这个要从前往后变的话,这个就写成I就行了,但是你这块呢,已经是倒着来的,因为你这块光考虑到就是我们后边这个希望能够好写一点。但是前边这块呢,你得弄清楚这跟它对应的这个东西。ar.n减一。再减个I是吧。比如一开始的时候,这个值呢,你看就是它,它呢就跟这个值是一样的,这不就是零嘛。它小一个,这个不就是角标就变成个一吗?以此类推。或者换句话说呢,你看这俩的和哈。是不是就也是单次减一啊。啊,对的好,那么通过这样的一个循环的话呢,我们就把这个new的这AR呢,就都附上去了,然后呢,你再把new的这个AR付给我们原来的这个AR。
09:09
可以吧?哎,然后这时候我们再去做一个re。哎,你看这个是不是也是一个交换。也可以啊,但是这两个方式要相应比较起来的话呢,是不是还得是这种要好一点。你这呃,新造了一个数组是吧,哎,那这是我们的反转呢,是完全可以不用新造个数度,这呢就额外开辟空间了,而且你这块也是一层for循环,我这也一层啊,甚至说你我这还是二分之N是吧,你那直接呢全部变了一遍,没有我这个好。OK啊,所以这个呢,相对来说呢,就不如这个一些,然后还有一个呢,跟他呢,其实是类似的,就跟我们这个方式一类似的啊,我这个我写成三吧,这个呢就叫不推荐了啊。不推荐了,然后呢,我写个方式二呢,其实本质上来讲呢,跟我们这个方式一呢差不太多哈,就是在我们这个方循关里边啊,我这样处理的哎,大家呢也相的见一见啊,我们实际上呢,是可以定义多个变量的啊,比如这个位置我定一个I呢,I呢就是零,然后我再定一个阶,这个阶呢,我就让它等于这个ar.las减一,相当于就是我们这个尾索引啊。
10:11
OK呃,然后的话呢,我们这个重视条件呢,我们等会儿看啊让利I呢,我们去加加逗号一下接呢减减。哎,通过这呢,大家也看到,如果我们定义多个变量呢,一个用逗号,然后呢,你要有多个操作的话呢,这个也是逗号。好,那么我想体现的点是什么呢?就是这个I呢,它就从这个位置开始。啊,这是控制这个I的这个指针的啊,所以I加加接呢,让它就等于最后的这个,所以我这时候要交换的就是角标I和角标接位置上的元素。那么I呢,不断的去加接呢?不断的去减中日条件呢?I接它俩就别碰头了是吧,一碰头一交换那那就回去了,所以I应该得小于接,那等于呢。等于就是它俩就指向同一个了,那就别画了是吧?哎,所以这个中置条件呢,就是I呢,要小于几。
11:04
哎,这样就可以是吧,哎,这个咱们把方式三呢给它注入掉了,行,那么这里边的交换的话呢,其实就是哎,我们这块交换的就不是ari了哈,而是ari和AR接。哎,就可以了啊,行,那对应的一个tap。Ari。哎,AR这个接。哎,等于他吧,诶这是不是就搞定了。OK啊行,上边这个注释了,下边这个注释了,然后我们这个啊,这个也得给它注释掉,来再去遍历一下,来我们走起。好,你看这时候发现呢,我们实际上也实现了一个反转。没问题啊,行,那么这里边这个方式一也好,方式也好,它俩其实差不太多哈,只是从这个语法上来讲呢,我们稍微的讲了另外的一种形式,大家以前可能比较少见啊,所以这块呢,我们稍微把这个呢说一下可以呢,在一个for循环的出始发条件部分呢,你定义多个变量中间呢,用这个逗号给它隔开就行了。
12:04
OK行,这个题目我们就说完了,这个说完之后的话呢,诶,这个参考图是刚才也说了哈,然后呢,大家再看这个拓展啊。这个拓展的话呢,其实跟这个反转呢,是同样的解决方案,它呢有一个问题是什么呢?说判断一个数组是否是对称数组。哎,什么叫对称数组呢?你看这个里边啊,我第一个元素跟最后元素呢,它俩得一样是吧,第二个跟倒数第二个,第三个跟倒数第三个,以此类推。那如果说中间这个没有配对的,那就他自己了。哎,那我现在列的这个呢,就属于一个对称数组。那你说我们如何判断一个数组是对称数组呢?哎,不用再反转了,你就只需要呢,判断一下我这个I的位置的元素和接这个位置元素,我们反转呢,就要交换是吧,你就判断它俩是否相等就行了。
13:03
然后你额外的可以外边定一个变量,布尔型的变量,一旦要发现有一个不等了。就不break了是吧,然后你在那个if里边判断它俩,如果要一旦不等就给它给那个flag负个值就完了是吧。哎,就行,其实呢,解决方案是完全一样的,但是你看这体面呢,看似呢就不同了。OK啊行,这个呢是我们涉及到叫元素反转啊这个操作行,那么关于我们说数数组这个常见的算法操作,第一波咱们就整个告一段落啊,关于数值类型的,哎,这些平均值,最大值最小值总和,这个呢,我们看似呢还是比较简单的啊,但实际开发当中这种场景呢,还是挺常见的。OK啊,然后第二呢说诶数组元素的这个赋值操作这个呢,也是比较常见的,哎,数组这个载体大家可能很容易想到,那就是关键呢,这个数组的元素呢,它是有特征的,你按照人家要求这个特征呢,你去负这个值。诶,关于数组的一个复制,咱们也说过了啊,数组的反转,OK,这张是咱们的第一波。
14:03
OK,那么接着的话呢,我们再来看一下这个第二步关于算法的常见的一个操作的问题,啊,把这个呢,我们就收起来了。哎,来看我们这个啊,哎,这个里边的话呢,我们打开这个T,哎这呢,我们讲这样几个事儿啊,第一个关于数组的一个叫扩容与缩容。啊,这儿的话呢,我们在后边集合当中啊,其实我们是会感受得到的,当然我们讲源码的时候呢,到时候会讲这个扩容的事儿啊,包括呢,在一些场景下呢,还会有这种缩容的一个情况,怎么叫缩容是吧,到时候我们再说一下啊。好,然后下边这块呢,关于数组元素的一个查找啊,这个呢,其实我们在实际开发当中啊,还是挺常用的,我们把数数据呢,就存储到相应的一个容器里边了,现在我想找一下里边有没有某个元素,如果有呢,你把这个元素呢给我呈现出来啊,这个呢就是一个查找或者叫搜索检索都可以啊。好,第三呢,叫数组的一个排序,排序的话呢,还是比较重要的一类算法,哎,排序的主要目的呢,很多时候呢,也是为了更好的实现一个查找。
15:00
啊好,这呢就是我们要说的第二类的一个算法的操作,那首先我们看第一个啊,关于数组的扩容和缩容,那这儿呢,我还是列了两道题目,咱们直接来做一做就可以了。啊,首先呢,这块有一个数组已经给我们了,那呢现在希望呢,把这个数组呢扩容一倍啊,并且呢,把十二十三十这个数呢,添加到现有的这个数组当中。那自然而然的啊,它其实就让你放在它的末尾了。因为咱们说数独的元素啊,它是有趣的啊,我先放的一,一就在前边,二呢在后边,所以这放的三个新的元素没有说,那就一定是往后放。哎,而且呢,不会是这样子的啊,比如我们这个12345,咱们放到这儿了,后边这块不又空出来五个空吗。那有同学说,诶是不是说他可以把十二十三十放到最后这三个呢。不行,咱们说过呢,它是依次紧密排列的。哎,那就意味着你只能是放在这个五的后边哈,你要空的也应该把后边的给它空出来。哎,这就是数组的一个典型的特征,哎,大家要注意啊,好,那所以这道题目的话呢,我们看该怎么去实现啊。
16:04
来这块我们去新建一个啊。RAE1,这个我们还叫零一杠一吧。这样啊,哎,没方法进来。好,那么首先呢,这个数组呢,就声明出来了。啊,那么接下来啊,这块首先呢,提到了叫扩容一倍是吧。容量这个事儿怎么做?新建不新建行吗?不行,对。哎,大家这时候就回忆我们讲数独的特征啊,说呢1235已经放这了,说扩容一杯,哎,直接往后整一杯。不行,哎这块呢,我们讲数组它的特征里边提到了,说数组,哎其实应该算是两个小点哈,第一个哈,一旦初始化,其长度就是确定的。啊,不管你是静态初始化还是动态初始化啊,只要初始化完以后,这个长度是几五。啊,你不可能说,哎,可能是五,也可能不是五,不会的啊,一旦初始化了,数字的长度就确定了,这就是五,好一旦确定了。
17:02
它的长度就不能够再更改了。啊,包括呢,我们一会儿还说缩绒的啊,缩绒你看我们怎么怎么做,一会儿我们再说哈,总之呢,就现在这个长度就是五就定死了,不能够动,你想给它再扩容一位,那不好意思,你再去新造一个。咱们前面也解释过了,说为什么不能在这儿直接接着整呢?对,首先的话呢,就是你要整啊,也只能是接着整,因为咱们说了它内存中它必须得是一块空间连续的是吧,所以你不能说我这块我再整一部分给你,这俩没挨着,那不行,这不是数组啊,数组就得是一个一个的挨着的。所以说你要整也只能是在后边整,但是后边这个空间呢,有可能已经给了别的数据了,是吧,所以你就整不了,但接着的话呢,你要想扩容就得是新造一个啊新造一个,然后呢,你再把现有的这个元素呢,一个一个的给它复制过去。才可以。好了,这个我们来处理一下啊,现在咱们创建一个叫new air。
18:00
然后呢,他去逆一个特性的数组,这个位置我们写成。a.Les。乘以二是吧,哎,这就是扩容一倍的一个意思。哎,说这个呢,我们能不能稍微的写的再稍微的看着漂亮一点呢。哎,我说一下这个位置呢,大家可以直接把它改写成是叫左移一位呀。这不是微微反福就出来了吗?啊,以后我们看集合底层源码的时候呢,他就这样做的。看着能高大上一点是吧?哎,这个我们写成叫或啊好,那么这个呢,我们就扩容为一倍了,然后下一步啊,要做的是说将原有哎数组中的元素哎复制到哎新的这个数组中。哎,这个事呢,就比较简单了啊fori一下,注意这个位置我怎么写。是a.Les呢?还是new a.Les呢?对,这个位置呢,它俩不一样啊,一个呢长度是五,一个长度是十了啊,你只需要呢,是不是五次就够是吧?哎,所以这个呢是A2点单哈,好,然后这里边呢,就是你有AR。
19:07
I,那拿AR这个I呢,去做一个赋值就行了。这呢,其实只是到五这儿了,哎,那么后边那五个呢,元素是多少。就是新的这个数组里边后边五个元素。全是零吧,对,这就咱们涉及到默认值的一个问题了啊好,那这个完了以后呢,接着他又提到了,说将哎这十二十三十这三个数呢,添加到这个数组中是吧。哎,添加到新数组中。哎,这个呢,就你只能是一个个来写了啊,说你有一个AR,诶注意这块这个角标怎么写。是。呃,应该是a.Les。佳一吗?这块注意对,咱们角标从零开始的是吧,这个原来的这个速度,这不是你赋值的时候,这个I呢,就到点less减一了吧,所以这块就是less了是吧,对这个小心一点啊,然后这个位置呢,一个加个一。
20:03
嗯,对,这个位置你加一个二啊。哎,有的同学说,哎呀,我这块我我上来我就写那个加一了,这就加二,这就加三了,哎,对这块呢,也不会报错的啊,那你就接着呢,往下走,走完之后呢,你最后还要打印一下,你打印你看看对不对是吧。对,一看错了,错了再往前移。啊,你要是这块呢,就上来写个加一了,最后不就成了说12345来个零对十二十三十了。哎,后边还有个零是吧,这就不行了啊好,那么这块呢,我们添加到新的数组中了,注意后边这个操作呢,不要忘了啊,我们需要呢,哎,人家说的是给A2这个数组给它扩容一倍,所以呢,你最最最后呢,得把这个新的地址。付给咱们原来的这个AR变量啊,让这个AR变量呢,指向你新的这个数组结构。那原来的这个呢。哎,这个垃圾就可垃圾回收器就可以回收掉了,是吧,就不用了啊,所以简单化运算结构呢,就成这样了,本来这个AR呢,它指向的是这个长度为五的一个速度,现在你造了模仿着它啊,造了一个长度一给它多一倍的,诶数据呢,还都给它复制过来了,同时又加了仨数,然后把新的这个地址呢,再给了它这个指向新的这个呢,指针就不存在了。
21:14
那么注意哈,咱们这个垃圾回收器呢,呃,前面也都讲过了哈,它呢,就根据判断这个指针存不存在呢,进行垃圾回收的,这个我们称为呢,叫可达性分析算法。就是判断你这个结构呢,这个堆空间的对象呢,是不是可答的啊,能够被其他的变量啊,可以访问的啊,显然呢,是不能访问了,我就要回收,那么这个回收是马上回收吗。我一看到有一个不用了,我就回收,会这样吗?不会的啊,要这样的话呢,那这个垃圾回收器也太累了。而且垃圾回收器,他在回收的时候,他要判断一下,你像咱们现在呢,知道这个是垃圾,那内存中的占用的数据那可多了去了,你要是老是让他去判断时刻去判断他时刻呢得去,呃停一下我们的用户的一个执行啊。
22:02
他要判断一下哪些是占用的,哪些不占用,因为呢,我要判断的过程当中,用户还在执行代码,是不是判断的就不准了,就。一会儿这个用着,一会儿那个不用了,它总是在变啊,所以呢,我们在判断这个指针,呃,是不是有指针指向的时候呢,这时候得让用户的这个线程啊,先停一停。这个庭的话呢,有一个学术的名词叫做STW。叫到word。啊,把世界都停下来是吧,诶说白就是让用户的这个程序啊,你先停一停,所以说呢,用户现上要一停,这是导致就体验呢就差一点是吧,所以这个这次啊,你不能老是执行啊,极其频繁执行,所以呢,一般的话呢,咱们都是什么呀,这个堆空间啊,我现在就是有空间跟你这个,你现在有个新的对象来了,还有空间我就让你放,当你要放的这个数据呢,新要来的数据发现不够内存了,这个时候呢,垃圾回收器就开始启动了,说我这时候要清理一次了。说你这个用户线上你先等一等啊,我现在我要清理了,清理完以后呢,空间就腾出来了,然后你再放。
23:01
所以说这个数据的话呢,它其实不是马上就回收了,他等一等,等需要进行GC的时候呢,它才会被回收掉啊。行,那既然你只要新的呢,这个呢,就是我们所判定的垃圾,OK就不要了啊。啊,这个的话呢,我们是将。啊,新的呃,数组的啊,地值啊,赋值给咱们啊,原有的呃数组变量啊,这个呢,咱们在讲上边这个呢,赋值的时候呢,把这个事儿已经说过了啊,没有心造一个数组啊,这个呢,只是指向了一个你原有的这个数组而已。好,那么这个敷完以后的话呢,我们接着去遍历一下。那咱们这个AR啊,这个就这样了啊a2.34,哎,打印一下。哎,变量I,然后呢,咱们来一个。指标符啊,杠T。这个呢,就把它去掉了啊好,这时候我们去做一个运行。OK啊,这呢,就我们希望看到的这个情况,原有的这个数据在这儿。
24:01
忘了改了是吧,哎,是二十三十。诶,没有问题啊。好,那这呢,就我们所说的叫数组的一个扩容啊,那么以后呢,我们讲呃,集合啊的时候呢,底层如果涉及到数组扩容啊,也是这样的一个原理。OK啊好,那么接着我们再看第二个这个操作扩容会做了,下边呢,我们说有一个数组,这个数字呢,我希望删除数组当中索引为四的元素,索引为四应该是这个了。我把我删掉。你看现有的这个数组呢,长度是确定的啊。我现在呢,想删除指定某个位置的元素,你说我删掉。就怎么把它改成零。你看这样啊,是。嗯,4567是吧,呃,你说我删这个元素呢,是把这个删完之后呢,这个内存往前。整一下子。想到这儿。
25:00
这不行是吧,咱们说了数组的呢,这个一旦你触发完成以后以后呢,这个长度就确定了是吧,你不能这块呢,突然少了一个啊,它就指向这一片空间了。不能多也不能少啊,那你说我这个删除这个事儿是咋弄,嗯,对,刚才你看我说了一个想法,就是我能不能把这个改成零这样的。改成零的,你说长度确实还没变是吧。但是呢,呃,这个事儿呢,又违反了数组这个特征,什么特征呢?我们说叫这个元素呢,叫依次紧密排列,你要这块写成零呢,我是认为你这块有一个元素,这个元素是零,而不是说呢删掉这个元素了。所以你要说想体现的说这个长度还是用这个速度的话,你只能是拿六呢。把这个五给。覆盖掉,对,然后把七七再把这个六呢覆盖掉,那七呢。七这块没办法了,因为你还想用这个数组,那只能把这个位置改成个零。是吧?哎,就是这样行不行呢,这个呢可以,这是以后我们说数度想体验这个数据减少的时候呢,它的一种思路啊,那就是说那你这个速度呢,还是用它你想删某个元素呢,那这个所谓的山呢,我们就是一个后边元素往前顶。
26:13
就跟大家这个做核酸排队一样哈,这个人突然呢,他这块呢,说我就不做了,他就走了,他一走后边这个人顶上来都是一个依次紧密排列的,然后呢,最后这个位置呢就空出来,空出来的意思呢,就是你把它制成默默认值就行了。如果这要是一个string型的数组,把它制成。闹哎,只能闹就可以了,这是一种思路。那还有什么样的思路呢?对啊对,再一种思路就是大家说的这样哈,说你把这个位置删掉,删掉就意味着不要了,不要呢,那其实按说长度就应该减一了,那没办法,你要非要体现说减一,那就不能在现有的数组上操作了,因为数组呢,刚才还是那意思啊,一旦确定初始化了,它的长度就确定了,就不能改了,所以你得在新造一个数组,诶等于原有数组长度减一是吧。
27:03
然后把原有数组元素呢,一个一个的该复制的复制到5G呢,你就不要复制了,那接着就六七,然后再把这个新的呢,再指向你原有的这个旧的是不是就可以了。对的啊,这种思路其实用的比较少啊,一般咱们所谓的这个减少元素呢,都是刚才说的第一种思路。啊,第一种思路啊,那咱们也可以把这两个作为练习嘛,都写一写啊。练习这个我们叫杠二了啊。好,没方法进来。回来先把这个数组呢,我们给他拿过来。哎,所以大家呢,应该找找这种感觉哈,随着咱们不断的去写代码呢,其实你会发现哈,呃,相较于这个语法来讲,最重要的还是你解决问题呢,有没有思路。是吧,哎,你有思路以后呢,这个预言啊,其实就是你的一个工具哈。就是你要完成这个事儿,然后呢,怎么去使用它合法的规则,然后呢,把这个事儿给做成了。啊,就跟大家说英语,说说汉语,咱们是一样啊,天天说普通话,其实这样语法呢,大家都是OK的,呃,中午让大家做个演讲,你现在感受不到啊,呃,这个说这个困难点在哪啊,其实关于语法层面的,你完全都没有任何障碍,每个人都会说。
28:12
关键的就是你怎么整合你这个演讲的一个主题是吧,从几个方面去论证是吧,我举哪些例子,最后呢,是不是还得来个总结,这个呢,实际上是你演讲的核心。啊,你要没有这个思路的话呢,这个演讲八成就做不好了啊,但是咱现在刚开始学编程呢,一开始其实学的是语法,一旦这语法呢,大家都掌握以后,那我们讲十多天,这语法就基本上就OK了,就完事了啊后边呢,就是一些应用场景啊,在关键呢,还是看你拿到这道题目,这个具体的场景的问题,你有没有解决问题的思路,这个是最核心的,语法上大家基本上就都OK了。啊,OK,行,那么回过来。哎,这块提到了,说我们要删除的这个啊,Delete的。哎,它的一个index啊,这常提到是这个索引四了。啊,对应的元素其实是它啊好,那这块呢,我们说它的这个呃,方式一吧,这个方式一的话呢,我们相当于呢,就是嗯。
29:04
这个叫什么不新建。来数组,哎,在原有的数组机上呢,数组的基础上呢,我们体现这个删除,那刚才说的就是后边往前移动的这个问题了啊,那那前面这些元素呢,就不用动了啊。到这块这都不用动,那这个,所以我们就一个I呢,等于。The index是吧?好,然后呢,I小于。到结尾是吧。可能我们一开始想到的就是写它了啊,然后I呢加加是吧。里边怎么写?啊,我们现在要找到这个ari,这是初始的一个元素,让它后边的元素呢。是不是替换它。对,替换替换替换替换,你说这块有点问题不。对这个问题呢,对有同学发现了哈,问题来源于呢,可能我没发现,但是你运行代码,其实你就看得到了。
30:02
哎,书读角标越界了是吧?哎,在这个第19行所呢,我们本身的这个less呢,是七,你却出现了索引七的这个位置了。为什么?对这块有个加一。对,其实我们说后一个呃,覆盖前一个,后一个覆盖前一个,最后呢,应该是让它呃,能够取到最后那个最大的索引是吧。哎,你现在这个I最大呢,是Les减一,你再加个一不就成了点LS了。所以不行是吧,所以这个位置呢,小心一点。哎,记得减个一啊。哎,那它最大的不就是NAS减二吗。然后他再加个一,那最大的不就是LA减一吗。才对的是吧,好依次呢,后一个覆盖前一个,后盖覆盖前一个,然后最后呢,我们再去修改最后一个元素。把这个A2。哎,点length呢,减一把它呢,制成一个默认值。是吧,哎,这个我们写啊设置为。
31:03
哎,这叫哎默认值。就是这个呢,我们设置成别的都不合适啊,写成个零呢,哎,算是最合适的了。嗯,OK行,那这个呢,我们就做了一个修改,修改完以后呢,我们在这接着啊,咱去遍历一下这个AR这个数组。一下。a2.less啊,这时候这个速度本身长度呢,咱们都没有动它。来保存,来运行。好,你看原有的这个是1234567啊,现在是12345没有了,然后六七,哎,这个我们支成零了。哎,这个呢,就是我们说的第一种处理方案是吧,哎叫方式一了啊行,然后呢,我们在哎这个位置,哎,我这呢写一个叫哎方式二。这个咱们把它呢注释一下。哎,放这儿的话呢,我们说呢,就新建一个数组。新建数组,然后呢,这个新的数组的长度是吧,比原由数组。
32:01
哎的这个长度,哎,少一个是吧。少一个啊,行,这时候我们就来了啊,说in的一个数组,我们叫new的一个A。哎,然后就等于逆一个因特型的数组。那这个位置就A点。减一是吧,嗯,好了,然后接着的话呢,我们得给新的这个数组呢,依次附上值了,这个赋值操作呢,我说你就得是分成两块来看待了。对一块呢,就是他之前的这些是吧。然后呢,再付的时候呢,就把它给过掉。然后再付之后的这一块。嗯,OK行,那这块呢,我们其实也可以考虑,就写成两个for循环了啊,诶第一个呢方循环,我们让这个I呢小于。哎,先我们放它吧。嗯,先放它了,好进来这个你的这个AR。哎,这个呢,我们就写成I了,让它是原有的I的位置往这附哈,这块考虑一下,这个写它对不。对的是吧,对,我们要删的是它,那它之前的不就是哎,Delete index减一,哎,正好这都取到这了是吧。
33:07
没问题啊行,那接着的话呢,我们再付它后边的啊。那in的一个I呢,等于。我就写成叫delete index。这个得考虑一下,然后I加加是吧。这里边这块是个难点,哎,可能我们比较直观能想到的就是ar.les。先写成它是吧,然后我们细微的体会一下啊,现在我们希望呢,是不是拿这个A22,诶这块你写的时候也得小心点了啊。这个怎怎么写。你注意啊,人家是它得是依次紧密排列的啊,前面这个I呢,最大已经到delete index减一了是吧,那下边这个呢,应该是就该delete index了吧。所以这块我就得写成I了。再说一遍啊,就是你上边这块呢,不是1234,这已经把四附上了,你下边这个再写的时候,是不是必须得从这个下个位置开始啊,它得是挨着的,哎,那么上面是delete index减一那个,所以呢,这个呢就是从index那delete index开始的,好,那后边这个位置这怎么写。
34:16
哎,我说这个得写成叫I加一了,因为你得把这个数组中你要删的那个呢,就过掉了嘛,是吧。哎,所以呢,他不就得提前就加一吗。嗯,OK,好,这是加一了。那这个呢。这个减一,或者你再理解成我们这个I这个呢,你得取到它最后一个,它最后一个,它比人家原有的这个长度少一个呀,所以你这样写的话呢,我们要一直行又。越界了。啊,你看这一直行,这个在我们的33行在这儿这块又又说越界了,因为呢,我们这个I它根本就没那么长是吧。哎。这块我们记得有一个简易啊。诶,它不是正好比你原有这个数组呢少一个嘛,所以它最后一个索引呢,不就是对应的减一个吗?这块它正好也有加一,它不也能取到它的最后一个。
35:10
嗯,OK啊行,这是我们在,诶还没完事的啊,这个我们附上值以后呢,接着啊,在这个位置呢,一定也记得把我们这个new的这个AR是吧,诶复制给我们原有的这个AR是吧。哎,这样才可以,然后我们再去便利这个AR。诶看下效果,哎,这时候呢,就是1234,然后呢六七没了,这到头了。哎,这呢也可以理解成是我们缩绒的一种诶方式啊一种方式,这个呢,就真正的把这个速度呢给它缩了啊,然后这个的话呢,我们就没有动,只是把它删掉,诶制成一个空的而已,但是呢,又由于数组的数组中要求元素得是依次紧密排列的,所以呢,必须得后一个呢去哎上来。哎,这样才行。嗯,好,哎这呢就我们说的这样的两个行为,哎大家目前呢,就把这两个呢,看成是两个小的算法题就行了,那以后呢,我们讲到集合的时候呢,到时候我们会讲这个扩容的事儿,包括呢,我们也可以做相应的一些这个项目当中,比如我们存储这个客户的啊,填了好多客户了,然后呢,现在呢,某个客户呢,他就这个叫什么注销了,那这个注销行为就类似于呢,相当于我们这个缩绒一样。
36:16
啊,你看你怎么去处理。OK啊,思路的话呢,通常都跟咱们的刚才写的里边的第一种思路呢是一样的。你想每次我们要删一个都去新造的速度,这个成本有点高是吧,所以一般呢,咱们都是这样来做。OK啊,行。
我来说两句