00:00
好,这呢是咱们今天呢做的这五道问题啊,那这样吧,咱们把这道问题呢,还是放在咱们的TXT当中啊,一块儿呢,来看一下啊。好,这呢,新建一个TXT文件啊,叫做D07。CV啊,把这一问题呢粘过来。呃,这几道问题的话呢,呃,四道呢,是咱们说的这个代码题啊,咱们前一天的话呢,关于这个数组的常用算法呢,跟大家呢就讲完了,那数组这块呢,我们也总结过了哈,说最重要的呢,还是需要大家来掌握一位数组和二位数组咱们讲的各六个点啊,这是呢,我们说需要大家重点掌握的。那么之后呢,咱们讲的关于这个数组的算法呀,这里边儿涉及到这个操作就比较多了啊,咱们也做了好几条这个主线的这个总结啊,呃,这块呢,就大家没有强制的一个要求,就是通过我们这个课上的也讲解,包括咱们后续呢,对数组再去使用,呃,大家呢,不断的通过这样的去这个练习啊,达到一个比较熟悉的一个情况就可以了。
01:03
啊,那这里呢,也体现了咱们这个讲数组算法里边的这样的一些操作了啊,首先的话呢,第一道问题说使用冒泡排序实现了如下数组的一个从小到大的排列。这个呢,咱们也说过了啊,大家呢,必须要能够去手写了啊,冒泡排序一定要手写,那快排呢,大家最好也是要手写,或者最起码呢,快排的这个实现的思路需要大家能够说出来啊,这个本来我想了想要不要写上这个考察大家一下,后来呢就是算了啊,但是大家呢,需要呢,能够说出来这个快排的一个实现的思路啊,最起码的。好,那么冒泡,那我们就来再快速的写一下哈,嗯,这儿呢,我们给的是一个in的型的数组啊,这个排序的话呢,首先得保证这个数组呢是可以排序的,那整形的话呢,毫无疑问是可以排序的,那整形之外呢,其实像咱们说的这个。String类型的数组也是可以排序的啊,String呢,这个排序的话呢,就是这个我就不具体去造这个数组了啊,就是比如说我们这个所谓的叫AA,这是一个字符串了,然后另外一个字符串呢,比如说叫AB。
02:08
啊,那这呢,很显然这个A呢要比AB呢要小一点啊,因为他们衡量A呢是一样的,在衡量后一个A的时候呢,咱们知道大A呢是65啊,大B呢是66啊,也就是说呢,通过这个字符的一个X码去做一个排序。啊,那咱们今天的话呢,也会讲对象,那对象呢,实际上也可以排序啊,不是按照它的地址值的啊,就是按照我们这个对象的某一个属性啊,比如说存了十个人,那每个人呢,都有年龄啊,咱们可以按照年龄呢进行一个排序,行啊这呢我们总结一下一句话啊,就是我们要想排序呢,你得给我明确的一个指标啊,按照什么样的这个这个这个属性,或者说呢,叫关键字进行排序。啊,当然呢,这个整形呢就比较简单了,咱们直接呢,就按照它存的这个数据进行排就OK了,啊这呢,咱们再快速的去写一下,首先呢,I等于零,I小于我们A2,点LA减一。
03:04
哎,这呢我们多说一句,实际上呢,大家写小于LAS呢也是可以的啊,写简易呢是因为呃,我们让它这个呈现的就更加的严密一些啊,因为咱们昨天讲的时候也说过了啊,如果是八个数的话呢,其实呢,进行七大轮就可以了啊,因为最后一个数呢,就他自己了啊,它自然而然的也就是最小的,所以这儿呢,我们有个简易啊。啊,就是不减的话呢,也不影响我们这个最终的一个执行的结果啊好,再接下来我们写一个for循环啊,一个阶呢等于零。呃,接呢,是咱们来控制真正这个数组的角标的啊,对于咱们冒泡排序来讲呢,它是一个呃,相邻元素的一个比较了啊接呢,小于A2,点LAS减一,再减去一个I。注意这个减I呢,千万不要丢了啊呃,像第一次的话呢,呃,I等于零的时候,咱们保证这个阶呢,呃,这个准确的说呢,应该是J加一对吧?啊这个我们先写写再说这个事儿啊,我们下边呢,展开的时候呢,是判断咱们这个AR2的阶啊,它呢是否是大于我们A2这个G加一,哎前提呢,咱们是从小到大排列啊。
04:18
啊,咱们呢,要保证的点呢,就是在第一大轮的时候呢,最后一个元素啊,最后一个元素呢,是可以取到的啊,你想想我们这写的是G加一,那就意味着这个G加一呢,我们让它呢去取到,呃,a2.las减一就是取到最后一个位置了哈,所以我们这写的是J,呃,小于它。啊,小A塔这个第一轮的话呢,这就是零了,小于它的话呢,那就是减二减二再加一,正好呢,角标能够到LAS减一啊就让它呢,能够取到最后一个位置,然后第二大轮的时候呢,最后一个位置已经是咱们最大的这个数据了。啊,这不是咱们一个数组嘛,诶第一大轮完以后,最大已经出来了,所以第二大轮呢,我们只需要到倒数第二个元素就行,所以我们就相当于是多减一个数啊,再来一轮的时候呢,再哎少减再这个往前一个数啊就是这样的一个情况。
05:09
啊,就这样个情况啊,所以这样来看的话呢,我们最大的数呢,是先出来,然后其次再其次,再其次,就有点像这个水里边水泡一样啊,这个大家知道,这个鱼缸如果比较深的话呢,最下边这个泡比较小,越往上越大,哎,所以呢这呢形象呢大家去理解,这个叫冒泡排序啊,是这样的一个情况,那一旦发现前一个数比后一个数大的话呢,咱们就做一个交换啊,Int型的一个tap。这呢是这个街,AR这个街。呃,再用这个J加一呢,进行一个赋值。在这接着啊,接加一。哎,再拿咱们这个呢进行复制。好,这样的话呢,我们就实现了一个交换。啊就实现交换,哎这呢就是咱们所说的这叫冒泡排序了啊,这个大家呢都需要会写啊,主要呢就是关于这两个for循环的这个循环条件啊,大家呢不要写错了,哎后边呢,这个交换这个事儿呢,哎,所有同学应该呢都会行,这呢是冒泡就完事啊,大家都需要能够手写,那快排这块呢,刚才也说到了。
06:14
快排啊,大家呢,至少你得会这个思路啊,至少得会这个思路,同时的话呢,还要求大家呢,就是你得掌握就是关于冒泡排序和快排的一个时间复杂度啊,那快排的时间复杂度呢,昨天呢,带着大家也稍微推了一下啊,这个我们说是一个大O。然后呢,是。哎,N乘以log n,这是它的一个复杂度,那么对于这个冒泡排序的一个时间复杂度。哎,冒泡的一个时间复杂度。哎,这个呢,我们说是,哎这个N的平方。哎,平方呢,这样来表示一下,哎这个呢,大家需要记住它啊,呃,因为这两个呢,咱们说呃相对来讲冒画比较简单,快盘呢用的最多,哎它这个复杂度呢,都需要大家记得住啊就可以了啊,那另外呢,咱们还提到大家需要去关注的呢,就是这个叫堆排序,还有我们的叫归并排序,呃这个呢,有可能在面试的时候呢,会问一问你这个实现的一个思路啊,大家下来呢看一看就可以了啊。
07:19
好,那除了呢,我们这里边儿提到的这四种排序之外呢,还有很多其他的排序啊,嗯,简单来说一下,比如说还有一种比较简单的排序呢,叫直接选择,这呢是我们一个混乱顺序的一个数组,这个直接选择呢,它是这样做的啊,首先呢,我取其中的第一个元素,然后让第一个元素呢跟我们第二元素去比,把相对较小的就放在第一个了。那也就是说呢,跟第二个比的时候呢,如果第二个更小,那就交换一下啊,那交换完以后呢,保证我们第一个呢是一个当前的最小的,再拿第一个跟第三个比,第一个跟第四个比啊,跟第五个一直呢比到最后一个,只要呢发现这两个数据一比呢,后一个小,我们就做一个交换,那始终保证我们第一个这个数呢是较这个,这个对比以后呢是较小的,那都比完以后呢,最小的就放在这儿了。
08:04
然后接下来呢,再拿第二个跟第三个,第二个跟第四个啊,跟第五个跟第六个,所以它呢,是这样的一种思路啊,跟咱们那个冒泡呢,确实不同,冒泡呢是比较的,叫相邻的两个元素。哎,始终呢,就是把持着这个叫相邻的这个事情啊,关注一下。好,那第一题就过了,然后第二题的话呢,我们说叫如何反转上面的数组,用代码实现,呃,这个呢,咱们昨天也讲过了啊,两种方法,呃,实际上本质上来讲是一样的,呃,这块我就不在这儿具体去写了啊,我就写一个略,哎大家呢下来呢再看看,一会儿咱复习呢也会说啊。下个呢说叫复制上述的数组。哎,把咱们上边这个数组呢复制一份。这个事呢,咱们昨天明确强调了啊,尤其呢,大家需要跟这个所谓的叫赋值操作呢区分开,哎,赋值操作咱们昨天讲的啊,我定义两个数组,如果呢,是通过这样的方式给我们的瑞二负的值。
09:04
嗯,这个呢,只能叫一个赋值操作啊,相当于呢,咱们创建的只是一个快捷方式。啊,只是一个快捷方式啊,那怎么叫复制呢?就是我们必须得真正的重新new一个数组才可以,诶我们new一个in特型的数组,然后呢,真正的给我们去开辟内存的空间啊,那这个长度呢,就拿咱们最初的这个,诶数组的长度呢去做一个。呃,这个设定啊,作为我们新的这个数组的一个长度啊,接下来呢,大家再通过这个for循环啊,这个呃去往里边写就可以了,这呢我就省略了啊呃,就是大家呢,一定知道这才是新造一个,那就意味着呢,就是。比如说啊,我这里边。我这里边的话呢,有这个叫D盘,然后这个D盘的话呢,我有一个十个G的文件。我现在呢,想把这十个G的这个文件呢,复制一份啊复制一份的话呢,呃,那就意味着呢,我们需要另外的一个十个G的空间啊,去存放我们这个,呃,复制以后的这个十个G的文件,最后呢,结果就是我一共会有20个G了。
10:11
啊,会有20个G,那也就是从我这个,比如说一盘当中,我目前呢,是有113个GB呢,是可用的,我要想复制一份呢,它就会变成103个GB了。哎,是这种情况啊,而不是说呢,我们复制一下啊,你看见两秒钟就完事了,只是给你建了一个快捷方式,那才几KB可能啊或者多少B。啊,那非常小的啊,只是呢,建了一个呃,地址的一个索引啊,所以呢,这个就不是真正的复制了啊,顶多呢,我们可以算是一个叫赋值操作。好,这个大家要清楚这个区别啊。行,下一个下一个呢,叫做线性查找啊,那查找的话呢,咱们说在这个最基本的算法里边呢,它也算其中的一个了,那另外一个呢,就是咱们所谓的排序啊,排序查找,这是最基本的这个算法里边的两类操作,那么线性查找呢,又作为最基本的一个查找的一个操作啊,就是有点像这个地毯式的这种搜索一样啊,一个都不落,呃落下啊,一个一个的这样去找啊,比较慢一点啊,但是呢,这个呃效果的话呢,还都比较好,具有这种普遍适用性啊,这叫线性查找。
11:20
那我们这呢,需要找一下这个22呢,是否存在于咱们上述的这个数组当中,那就遍例就完了,对吧?这个咱们昨天写过了啊,这呢咱们快速的写一下啊,In特I等于零,然后呢,I小于我们a2.ls减一,哎,不减一了,直接点LS了啊,然后I加加。好,那进来以后,哎,我们去做一个判断哈,说如果呢发现啊这呢举个例子,咱们这个int型的dest,就是目标要找的呢是22,如果呢,发现咱们的dest呢,是等等于了其中某一个I位置上的元素。诶,这就说明我们找到了啊,我就捡起了直接c out输出一下我们这个,所以位置叫哎。
12:04
啊,这是咱们通常的一个习惯哈,就是一旦找到以后呢,我们返回的都是这个索引的一个,呃,地址啊,索引值是多少啊,那最小的就是零了。好,那一旦找到以后呢,咱们通常呢,就会掉。那有的同学可能会担心,那万一要是这个数组当中呢,有多个22怎么办呢?嗯,多个22呢,也不用担心,那咱们通常呢的通常的这个策略呢,都是返回首次出现的一个缩阴位置了,就是一旦找到我就停了啊,后边就不找了啊,就这个意思啊,再比如说呢,像咱们这个字符串也行啊,我这呢是一个hello,我想找这个L啊,这个我们string当中呢,有相关的这个方法啊,哎,我想找L的话呢,你发现它找的呢,就是首次出现的这个L叫二这样的一个这个索引就给返回了。那后边这L呢,其实就没有再去找了。啊,但如果说你要是想找后边这L呢,也可以啊,咱们还有相应的其他的这个方法,你可以让他指定从比如说咱们这个二之后啊,这个这个子串当中再去找也行。
13:10
啊,就是也能够找到后边这样出现的啊,OK,包括呢,这个string当中还有这个方法呢,就是让你倒着去找,哎,看看从后往前找首次出现的位置是多少,哎,这都是相关的一些现成的方法去调的啊,但是默认情况下呢,我们要找的话呢,它有多个都是返回的,是首次出现的一个索引位置啊,这个大家注意一下。那么如果要是没找到的话呢,我们说就要提示一下,说没有找到这样的一个信息啊,这个咱们是通过定义一个叫布尔型的变量来完成的,哎,我叫做is flag啊,等于一个true,等于false也一样啊,这无所谓。嗯,那我这里边的话呢,一旦找到了is flag。Flag。哎,等于,哎,我这改成是个false。这个flag呢,我写错了啊,改一下哎,一旦找到以后呢,我们就修改它这个标识,那么当我们这个循环结束的时候呢,咱们来判断一下我们这个flag呢,是否变过啊叫is flag呢,如果它还是一个处。
14:14
啊,如果大家一开始这定义的是false,这就改成true,这呢,前面你就加一个叹号,这就表示非的意思嘛,就OK了啊。行,那如果你要是个处的话呢,意味着我们就没有进去过if服,那自然而然的呢,就意味着没有找到,所以我们就可以去CA也说啊未找到。行,这呢就是咱们这道问题的一个解决的方案。啊,解决的一个方案。呃,咱们上课呢,也是这样讲的啊,那么实际上的话呢,咱们说解决一道问题呢,他也不是说就得唯一的一种思路了啊,大家呢,这个思路呢,还是要打开的啊,其实我们讲这几天课,从讲流程控制开始,呃,实际上呢,我还挺有意识呢,去培养大家这种这个解决一个问题的这种思路啊,就这种呢,其实是能够长久的保存下来的。
15:06
啊,就是咱们现在呢,讲的是Java,只不过呢,咱们相当于是,呃,这个有了解决问题的思路以后呢,用Java语言去实现而已,那以后的话呢,这个还会有其他的语言需要大家去学习,或者说我们说的悲观一点,等到哪一天的时候呢,Java语言假设呢,不行了啊另外其他语言崛起的时候呢,诶大家呢,其实你只需要学习另外语言的这个语法就可以了。啊,那么有了这样的一个解题的思路啊,以后这个呢,实际上是可以直接迁移过来的啊,直接迁移过来的啊,所以大家呢,就是一方面学这个语言刚开始啊,啊,你要关注于这些细节,就是比如说这个分号呀,大括号的问题,那同时的话呢,大家也要有意识的啊,去理清楚解题问题的思路啊,当我们后边这个代码量越来越大的时候呢,这种解题的思路啊,或说或者说呢,所体现出来这个逻辑能力呢,就更加的重要一些。啊,就更加重要一些啊。
16:00
好,回过来我们再说这道题,这道题呢,咱们是通过这个呃,布尔型的一个变量的方式啊证明呢,有没有进去过,诶大家看我这呢,其实还可以有一种做法,这个咱们昨天没讲啊,哎,现在呢可以说一下。怎么着呢,哎,CTRLV一下先,我这呢就不要这个波尔型变量了,哎,这里边呢,自然而然就没有它了,这也就没有它了,那我们怎么判断说叫没有找到呢。大家看我这样做有没有道理啊,说呢,如果我们要是进入这个if了,说明呢,就是找到了,我自然而然的就去break,那你要是没有进去呢,自然就是没有找到,嗯,咱们这个循环的话呢,结束咱们讲过哈,循环结束呢有两种方式,一种呢是遇到break,那就意味着是找到了,另外一种呢,就是我们这个循环条件呢不满足了。啊,循环条件不满足呢,自然而然的就退出循环,那就相当于我们没有进去,不是通过break结束的,所以呢,我们在这个位置,大家看我这样写哈。
17:00
说一旦呢,我们这个I等等于a2.las。哎,注意呢,是点LAS啊,一旦呢是I和ar.las相等,我说呀,就没有找到。对吧。大家想一想这个问题。就是咱们这块呢,呃,通过这I加加的方式不断的去进去,哎,然后呢,这个呢,因为咱们没有找到,所以I不停的加加,然后呢,挨到最后一个允许的范围呢,是点LAS减一,哎也没有进去,然后它在加加呢,就变成点LAS了,结果呢,导致退出循环了,哎如果咱们发现呢,它恰好是点LAS,那就是没有找到。哎,就是这个情况,所以大家这个思路呢,其实呃,要打的开一些啊行。嗯,这是咱们说的这个问题啊,那么最后一个题目说数组中常见的异常有哪些啊,这呢,咱们也这个昨天都讲过了哈,两个常见的,第一个叫ary in death out of bounce exception。
18:08
哎,这个呢,我们叫做数组角标越界的异常。行,这个要举例子的话呢,其实也很好举啊,就是在咱们这个Java当中呢,就是我们允许的一个合理范围呢,就是从零开始啊,这个我这样写是吧,这个合理的范围哎,就是我们从零开始啊。啊,一直呢,到我们这个数组点LAS减一,这是它的一个合理范围,只要呢,不在这个合理范围之内的,我们都认为它是一个非法的,那这个非法呢,就是我们所谓的叫越界啊,那就意味着呢,比如说咱们写的是A2,这个像负一啊是吧,然后呢,比负一还小的,这都是,或者呢是我们a2.las,哎这呢都算是叫越界。啊,周三是越界,呃,昨天咱们也还说了一下,跟那个Python还不太一样哈,Python的话呢,这个右边叫越界了,左边呢它负一,呃,反而呢,输出的是我们这个,呃,这个算是数组的啊,最后一个元素了啊,就是它允许呢,你再负着往前走一轮啊,是这样子啊,你要再往这走的话呢,就不行了啊,它就又错了啊在咱们Java里边呢,就严格的要求是在这样的一个范围内啊,这叫越界,然后下一个叫空指针啊,Non poer的exception。
19:28
哎,叫空指针异常。好,这个控制人异常的话呢,也是需要大家确实能够写出来一些这个例子的啊,嗯,在这个面试当中呢,也有一道比较经典的题目,就是说常见的异常呢有哪些啊,并能够举一些例子啊,当然这个问题呢,咱们现在呢,先不用去关心啊,咱们专门讲到咱们的课件当中这个异常这一章的时候啊,再去带着大家去总结。行,那这呢,关于这个控制人异常的话呢,我们举例子的话呢,也比较容易了,我这有一个呃,一维数组啊,这块呢,你是一个闹,在闹的情况下呢,我们去调其中的某个元素,那它就控制人了。
20:09
啊,所以呢,我们去区分控指针还是脚步越越界呢,其实呢也比较容易啊,有的同学可能刚开始还行,后边呢就晕了哈,不知道到底是脚步越界还是控制帧了,那你就看这个本身的这个结构呢,首先是不是有了,如果要是没有,你去硬去调它的元素,那就控制帧,如果有了,但是呢,你输入的这个范围呢,不合理啊,这就叫做角标越界。啊,这样的方式让大家去做一个区分,行,这呢是咱们这个今天的这五道问题啊,大家下来呢,再写一写,看看谁写的不好的话呢,把这个再稍微做一做啊这个严格上来讲的话呢,像这些操作呢,嗯,咱们平时开发中呢,就是可以考虑用一些呃A瑞啊,或者第方第三方的一些工具呢,直接去调用,但是呢,通过这些题目呢,还是希望大家能够去锻炼锻炼这个解题的一个思路啊,或者叫训练训练大家这个思维能力,因为后面的话呢,咱们开始讲面向对象了,哎,更多的呢,其实还是一个知识层面的。
21:07
咱们前边的话呢,讲了流程控制,讲了数组,实际上这里边儿呢,涉及到很多的一些细节的算法问题啊,是能够锻炼大家的这个思维能力的,本身呢,我们讲流程控制和速度,其实从这个语言知识层面上来讲,呃,谈不上多难。啊,实话讲谈不上多难,只要你脑子不太笨,这个把这个东西背一背,这个格式啊都会写。啊,都会写啊,你要想定一个异位数组初始化,静态初始化,动态初始化,这个你写不了,那一定是你没有用心去做啊,你多写几遍一定可以掌握的了,哎,但是呢,像这种算法层面的一些问题,让你写个快排啊等等,这个呢,确实需要花点时间去提升大家这个理解力啊,一直给大家讲的就是提升你的这个认知能力。啊,这种能力呢,实际上是可以去迁移的。咱们后边呢,哎,不断的讲课过程当中呢,咱们再去,呃,深刻的去体会这个情况啊就可以了,好,这呢是咱们今天讲的这五道问题。
我来说两句