00:00
那么咱们这一章的话呢,叫数组,那一位数组二位数组啊,咱们就告一段落了,实际上呢,这一章如果从知识点上来看,基本上咱们快收尾了。从知识点上来看啊,你要后边说哪个,我说基本嘛,这说明还差点啊,差哪个呢,就是后边我们讲这个瑞工具类啊,包括呢,像我们说的异常啊,其实咱们已经见到过了,只不过呢,我们稍微的再去总结总结啊,啊那么知识点完了以后啊,在实际开发当中,我们用数组啊用的挺多的。那用的多呢,就体现了针对于数组的多种操作,这种所谓的操作呢,就有好多种不同的这个场景啊,然后把这些场景呢划分划分,呃,其实呢,也可以统称为呢,就是一些算法的问题了,所以这块呢,我们就来讲一讲啊下边这个问题啊,讲讲数字当中常见的一些算法操作。那其实这里边儿呢,谈不上说有什么新的知识点了,就是呢,拿着我们讲过的一位数组也好,二位数组也好,它的基本的这六个点,然后我们去解决实际的一些问题,当然这些问题的话呢,你有可能说,诶,我这块好像搞不定是吧?呃,其实这里边涉及到可能就一些逻辑和算法的问题了,这个呢就慢慢来,当然呢,我们前面讲的这个一维二维的基本的那六六个知识点哈,大家是下来一定要先弄明白的,那是基本功啊。
01:15
好,那这块呢,我们来看看这个第三个这个问题,关于数组当中的常见的算法,其实就是一些题目了。那么具体呢,都有哪些算法呢?我这儿呢,用了两个不同的这种包哈去呈现,哎,常见的算法呢,第一个啊,类型层面的这呢,我列了四个,涉及到了就是关于数值型的数组的一些特征值的统计。那比如说我们在讲数组,一开始的提到啊,说这个公司呢,这个回到我们课件这个层面啊,是不是一开始上面就提到这个事儿,说这个公司呢,有50个员工,然后呢,诶每个员工都有一个工资,我们希望呢,计算一下这个员工的平均工资和最高工资。那这时候我们就可以用个数组,然后呢,把每个员工的工资呢,放到这个数组的相应的元素的位置,我们通过循环的方式啊,取出他们的平均值,取出他们的最高值是吧?诶这个呢,就相当于是相应的一些数值型,在实际问题当中的一些操作了啊。
02:10
啊,这呢就属于第一类问题。呃,第二类问题呢,叫数组元素的赋值。哎,说这个数组可能告诉你是数组了,也可能没有告诉你。啊,没有告诉你,你还得能想到,还得要想到呢,是用数组来解决的,呃,然后呢,这块呢,你给这个数组按照人家的要求去附上值,这呢是第二类问题啊,这类问题呢,还挺多的。啊,因为实际的场景啊,都不一样啊,然后第三类的话呢,叫数组的一个复制,说在我这儿有个数组了。然后这个数组话呢,我希望呢,你给我复制一份跟它完全一样的。啊,这个呢是一个基本操作啊,那你也可以呢,实际情况呢,就是我们在复制的同时呢,把这个长度呢,再扩容一倍。比如原来的这个是五个元素,然后呢,这时候我想把它变成十个元素,呃,那前五个呢,还是放在这儿,后边呢又扩充了五个。
03:00
这个呢,是我们在实际开发当中会见到这种场景,在这个场景当中其实融合了你复制的这样的一个行为。这是这一类,然后第四类呢,就是数组元素的一个反转,那头呢倒到尾尾的呢,到头是吧,那12345,后来变成54321。哎,这就叫反转了,OK,这呢是呃这样的四类,那还有的话呢,就我写的这个第二步了,数组的扩容与缩容。哎,刚才我讲这个复制的时候呢,其实其中的一个环节呢,就涉及到复制,诶这个复制的时候呢,讲了一下这个扩容的问题里边呢,有一部分操作就是个复制的操作了,那在实际开发当中,我们会遇到这个扩容和缩容的这种场景啊,后边我们讲这个集合的时候呢,我们看源码也会看到这样的类似的结构啊。然后接下来的话呢,针对于数组元素的一个查找,说这个数组呢,摆到这儿了,里边有好多元素,我现在想找某个元素存不存在,如果存在呢,你告诉我它是在哪个索引位置,不存在,你告诉我说不存在。那么这个查找的话呢,其实是我们比较常见的一个操作了,这个可以呢,叫顺序查找,也可以呢,叫二分法查找。
04:04
在这呢是两类算法啊,然后在下边儿就涉及到数组当中,哎,我们一提到数组啊,一提到数据结构,我们就提到呢,这个排序的算法,那我们在数组这块呢,就可以讲一讲排序的相关算法有哪些。好,整个呢,关于数组的算法问题呢,我们就落了罗列了这样的一些啊,这这三个加上这呢有四个,一共算是七类吧。问题啊好,那么接下来的话呢,我们就按照这个顺序呢,一类一类的,我们去做一些讲解,来做一些题目,哎就可以了。那讲完这个题目之后呢,相应的来讲,你的这个功力啊,应该是有所上升的是吧。好,那么首先我们就按照这个顺序来啊,先看这个第三波,这个呢就说起来了,第一个问题这呢是关于这个特征值的计算的。好,这儿首先提到了,说呢,定义一个in的型的异位数组,包含十个元素啊,随机赋值。随机复制的范围呢,要求是一个两位数啊,那就是从十呢到99这个范围,这个咱们也讲过公式了。分完以后的话呢,要求求出所有元素的最大值,最小值,总和平均值。
05:04
并输出出来。这个难度还可以吧。还可以是吧,好,这我们去创建一个啊。嗯,Read一个test,嗯,这个练习吧,嗯,E01是吧。A,方法进来。好,首先呢,第一步呢,我们需要呢,去创建数组。哎,创新数组这呢,显然是不是应该用动态初始化呀。哎,动态。哎,初始化方式来来创建这个数组好创建完以后的话呢,接着我们需要给数组元素呢去赋值了啊。哎,通过循环诶数组元素来赋值,这个呢,按照人家的要求啊,是两位数,哎,第三个的话呢,这我们就来求这个特征值的。哎,求条征值,比如说求最大值是吧,呃,依此类推的,这不有好多的这种需求了,那我就哎复制一下啊。最大值、最小值。
06:01
啊,这个总和。平均值。哎,等等啊,其实还有其他的一些比如方差呀等等的,那就复杂了是吧,那就不涨了啊。行,这呢就是具体的这个需求问题了。那下边我们看看该如何呢去实现。首先第一步说创建这个数组,这呢,因为负的值呢是两位的整数,所以呢,我就int型的数组了。长度呢,刚才提到了是。十是吧。哎,这个题目里面这不是十个元素吗?哎,你也可以呢,把这个需求啊,CTRLC诶粘过来放到我们这个描述这块啊。对放到这儿行,这儿呢创建好了,接着呢附一些随机整数,这呢我们就通过循环来付了。点length一下,AR要标I,哎,直接呢,我们就赋值了,哎,ma.random是吧。嗯,这个呢,是从十。
07:01
对到99啊,这个公式呢,回忆一下啊。乘以。B减A99减十。加一。90是吧。哎,我我我这样写全吧,99减十加个一是吧。呃,然后呢,这个结果呢,给他做一个强转。这个一定记得把这个括号括起来。再加上一个十。那这就可以了。好,那么通过这个负循环呢,我们把这个数组呢,元素就给它附上了啊哎,附上值以后呢,最大值最小值总和平均值啊,有同学说呢,说我这个负值的过程当中就可以求最大值。啊,其实也行是吧,哎,咱们做那个一位数组的时候,不是做过一个那个学生的那个题,当时不就是这样考虑的吗。哎,在赋值的过程当中,我们就求了是吧,哎,这个呢,咱们就呃。直接写到下边了啊,上下呢就分割开,上面就专门赋值的,下边呢专门求特征值的。好,那么这个求最大值呢,我先定一个啊,叫max吧。那你说我这个负值为多少?
08:04
哎,我就复制为第一个元素了。是可以的是吧,其实你随便挑个元素都行啊。那如果你要是不的话,你说我这块能不能写一个零。在对,在这道题当中是可以的。嗯,对,这道题可以,因为它有个明确范围,就是两位数嘛,嗯,你尽量让这个数小一点是吧,哪怕你写个十是不是也可以。也可以,因为它最小就是十了是吧,对对的啊,但是你要让我写个通用的话呢,建议呢,你就写成这个AR其中的一个元素,不妨呢,用A20了,好接着我们这个for循环,这呢,我就写成从一开始是吧。点LA一下,接着在里判断啊说如果这个max要小于你后边的某一个元素。哎,我们就做一个替换。是不是就搞定了?哎,结束以后呢,我们在这写着说,诶最大值为。哎,加上这个max就可以了。
09:00
没问题是吧。好,那么这个最小值呢,其实跟它这个套路呢是一样的啊,因为那个min呢,我们也让它是A20。哎,如果你要不写A20,你说我想写一个就想写一个值,那你这块要写的这个值要大一点啊。比如写成99。对吧。哎,对的啊。就你这个位置最小值这个你就不要写十了啊。你想对吧。对最小值,万一他要是这个人家对没有这个十都比十大了,那它成最小了是吧,其实又不存在嘛。A20。这样啊,循环。这个呢,我们还是写成一啊a.LS是。主要呢,就是里边这个逻辑呢。变成大于号啊。哎,如果你发现那A2呢,呃,这个min呢,它比后边的某个元素大,那就哎重新的制一下。哎,这就搞定了。最小值。范围。
10:01
哎,加上我们这个mean,哎。就可以了。好,那写完这俩呢,我们可以先测试一下啊。哎,最大的83,最小15,其实你也看不出来对不对是吧。因为咱们也没有便利他啊。对这个呢,你不行,你就在这个位置,它不是负上值了,负上值呢,顺便呢,我们在这块给他打印一下吧。这我写个I,那咱们在这个位置来一个杠T是吧,这个我就不要了啊。这个要不要了,这个位置呢,你记着在这个位置我们稍微换一下行。转一下。来这呢,就是我们本身的这个数组最大值啊,稍微搂一眼26啊,第一个就最大的啊,31最小的没问题啊。好,这才是我们说的这个问题。接下来总和。哎,萨姆,诶,这个血迹。说这个用写成A20吗。这个就不用了啊,总和的话呢,默认你就让他从零开始。对啊,这呢就是一个正常的for循环。
11:01
哎,不用打印了,萨姆加等于。ARI。哎,发行完了以后呢,直接输出就行啊。总和为。Some,诶,这不就搞定了吗?还可以是吧,好平均值呢。嗯,对,Sum已经都算好了是吧,哎,直接呢,你去除以一下我们a.Les其实就行是吧。哎,得到的,我们这个呢,叫int型的,叫avg的吧,啊一个Y6。啊,平均average啊,前几个字母啊,然后Y平均值。来打印。平均值为。哎,加上我们这个average的一个value。哎,这就搞定了。做一个。好,这呢是我们的最大值最小值总和平均值,诶搞定啊,这个呢,出现除不尽的情况呢,自动的就截断了,所以点八呢就可省略了,好这呢是我们说的这个第一个问题,这道问题的话呢,看着好像说也没有具体的场景啊,但是其实的话呢,它这里边做的这个事儿还挺多的,你要需要具体的场景的话呢,你看我们这里边的第二道题。
12:10
哎,这个第二道题啊,这就来了啊,说评委打分。这呢也是关于这个特征值的问题,说呢有这样的需求,说在编程这个竞赛当中,有十位评委打分的啊,分别对应的分数呢是这些,然后呢,要求呢,我们。判断一下这个选手最后的这个得分是去掉最高分和一个最低分之后呢,其余八位评委的平均值。一般不都是这样吗?啊,那这个题目当中其实就涉及到了我们这个特征值的一些获取了啊,最高分你得用着了,最低分也用着了,总和也用着了,平均也用着了。哎,这不就是这样一个场景吗?那其实呢,就还是我们刚才这个基本需求,但是呢,换了一个场景,感觉稍微有点懵是吧。这个怎么弄呢?E1202。
13:00
哎,没方法进来啊。好把这个需求呢,咱们粘过来。CTRLC。站到站到这儿啊。哎,CTRLY是吧。看看这个咋弄啊。哎,刚开始这个好整,先把这个数组给大家声明出来是吧。哎,这个呢,我们就直接印它行了啊。哎,数组这个我们就要scores,哎。这个直接我就省略前面那个new int了,把这个十个。CTRLC啊粘过来啊,这呢是十个啊没问题。嗯,那么接下来呢,你说我们怎么去计算这个平均值呢。最大最小。呃,还得把最高最高的肯定得找到了,最低也得找到是吧。那怎么把他们抠出去?诶,对的啊对,就是我们这样啊,咱们定义这个,首先总和得算出来,先让它是零是吧,然后你这个最大的呢,也给他回头算出来,然后最小的呢,回头也算出来。
14:12
啊,这个我先写个零吧,是吧。哎,Min呢,这个我们也给他算出来,然后你让这个sum减去这个max,再减去这个min,然后呢,让这个结果。是不是再去除以一下我们的scores?点减个二。哎,这呢,是不是我们的平均就出来了。哎,这就我们得到一个假设,你还要int类型的话啊,哎,这不就搞定了,所以这个关键问题呢,就是把这仨算出来就行。而这三个的话呢,我们刚才讲这个需求,这不都已经做过了吗。哎,这个事儿呢,其实基本上就出来了啊好,那么我们首先啊这呢来去声明啊,三个特征值。那么这个总和的话呢,是零了,那这个呢是几。
15:01
对这个要么你就让它是等于第一个元素是吧。呃,不是要么了,那其实就就是等于等于第一个元素了。都写零啊,都写零不合适吧,这个不能写零。哎,咱们就直接呢,叫SCARS0吧。零哎,就这样呗。行,嗯,这个呢,就这样写,那这个呢。所以就写零吧,啊好,For循环啊,For I,呃,你要是这块是零,你注意一点啊,就这个位置一定得从零开始了。嗯。scars.as.lesss是吧,就是针对这个最高分最最低分的话呢,我们到时候可以从这个第二个元素开始是吧,但是呢,你要是写一个一的话呢,我们这个sum就不太好弄了。这个呢,相当于你就把这个第一个元素给丢了是吧。那要么呢,就是也这样写,但是这个位置你就写成。相当于一开始呢,就把这个第一个元素呢,先抠出去了是吧,你要这边写零的话呢,这个位置呢,必须得把它也写成零。
16:05
有点绕。嗯,行,哎,那么这呢是我们求的这个叫嗯,累加的这个是总分啊,然后接着我们做了判断,如果max呢是小于。Scar。哎。这个呢,我们max呢,就重新赋值为啊scars I。哎,这样是吧,然后呢,注意下边这块我们再重新写一个衣服啊,哎幂它是两个逻辑大于。哎,M呢,就重新复制为。四杠三。哎,没问题吧。稍微的写一下啊,这个呢是用来累加。哎,这个,哎总分啊。哎,这个呢,我们是用于啊判断啊,这个或者叫获取啊。哎,最高分。这个呢,用于获取最低分。
17:01
哎,这样好,那么整个这个号循环完了以后呢,我们说呢,这个萨max相应的这个数据呢,我们就得到了。得到以后,哎,我们接下来去计算这个平均的成绩,就按照我们刚才说的这个逻辑呢,去写就行了啊,最后呢,我们写一个输入语句啊,说去掉最高分。啊和最低分之后啊,平均分为。哎,加上我们这个average就行。那就可以了啊,再问一个问题啊,如果呢,在这个打分这十个里边最高分呢,假设是九分,有两个九分怎么办。是把这俩都去了吗?那不行,去一个就行是吧,对最低分也一样道理啊,比如说有两个零分的,其实也是去一个就行。啊,不能再去了啊,好,实际情况呢,也是如此啊。哎,一下。四分是吧。哎,就是把这几个,哎,我们求一个平均去到最低最高之后啊,相当于就是这俩给去了呗。四份。
18:01
没问题啊。好,那么这块的话呢,我们是关于这个特征值的一个计算了。那我们通过两个题目,哎,大家呢,熟悉熟悉。好,那么这个呢,咱们就说清楚了啊,然后下边我们看这个第二类问题,这个呢叫数组元素的赋值。那这个问题的话呢,我们刚才也提到了,在实际开发当中遇到的场景呢,是比较多的,哎,那这块呢,我们举了相应的这个例子呢,咱去看一看,诶就看这道题了。看这道题啊,这呢涉及到一个概念,叫做洋灰三角。哎,希望呢,我们打印一个啊十行的阳灰三角,它这个题面的话说的很清楚啊,就告诉你是二维数组了。那那所以呢,这道题我们直接呢,就呈现出来,就是个二维数组倒出来,然后呢,把这个数组元素按照人家指定的这种规律呢,给它附上值,下边呢,就是来说这个规律呢。这个应该是咱们上上上初中还是高中的时候。小学谁小学讲这个了?啊。小学啊,小学奥数是吧。
19:01
啊,那低估人家了啊啊小学啊行,这个杨辉三角是吧。这个洋灰三角呢,它是这样子的哈,它是一个三角形的这样特征的一个数据哈,第一行呢,有一个第二行俩,第三行仨,以此类推,呃,它的特征呢,就是每一行的第一个元素。61。然后每一行的最后一个元素。也是乙,所以你会看到这样的特点啊。我画红色的这个线的这个呢,都是一。除了这个,呃,这个每一行的开头和每一行的最后一个元素之外,剩下位置的这些元素。这个值,哎,它呢,就等于它上面的这个元素。啊,如果说这个元素我们用它来刻画的话啊,它上面这个。应该是这个吧。上一行。列不变是吧,啊这个元素啊,就是它和它上边的左边的元素。就这个是吧。诶和它左边,哎,这两个元素的和。
20:01
那得到的结果呢,作为我们这个位置上的这个新的元素。那就满足这样一个关系,除了我们说这个边框这个之外,剩下的所有的位置都是这样一个特征,你随便找啊,三这不一二嘛,15啊15这个56 21 35,以此类推。都是如此,这个呢,就叫做洋灰三角啊。哎,这个阳位三角呢,得到以后呢,其实你要是呃,具体的看这一行的话呢,你发现呢,他得到这个数呢。其实满足我们高中讲的二项式定理的那个系数是吧。还记得吗?都忘了是吧。啊,它跟那个系数这个你拆完以后呢,它不是满足那个二项式定理嘛,是吧,它那个系数呢,拆开以后呢,就是这个值哈。所以说其实你说中国这块古代数学,经常咱们讲说这个呢,领先欧洲多少多少年,其实我们可数的那么一些东西是吧,包括勾股定理啊等等啊,所以说这个数学的话呢,可能各个民族呢,它都有一些发现哈,但是呢,典型来看,像中国这个咱们国家这种文化呢,在这个自然科学领域呢,有一些星星点点的一些成就哈。
21:09
但是呢,它形不成体系化的。啊对,像欧洲的话呢,其实咱们现在学的所有的这个所谓的自然科学,物理呀,数学呀,化学呀,包括一些工科之类的哈,机械啊,基本上都是来自于西方的这种现代化的这个推进啊。嗯,这个咱们国家擅长什么呢?啊,一个中药是吧。还有那中华美食是吧。你发现老外吃的那个西餐呢,有时候你就研究研究,其实没啥可吃的哈。啊,这个这个你看这个汉堡啊,或者这个一说法餐挺高级的,什么鹅肝啊牛肉啊是吧,其实就那么几样哈,其实在吃方面呢,中国绝对是呈体系化的。啊,你看这个,呃,佐料是吧,不知道大家有没有赶过这个农村大集哈,你看那个卖佐料的那一排过去了是吧,几十种佐料,然后呢,做法。
22:00
蒸煮煎呃焖等等等等好多种是吧。然后呢,原材料啊,青菜就一堆,肉呢也分很多种,那你想想随便组合吧。原材料做法,哎,还有具体的这些食物,诶,你组合组合,那这就吃的就很多了。啊,你看一个火锅,诶这个你火锅呢,要先放,这叫火锅,放好了再吃,这叫冒菜是吧?诶等等等等等等,这不好多种嘛,是吧?诶你说中国吃的方面绝对是成体系的哈,所以你出去国外以后呢,你活不下去了,你就开个饭店得了是吧?诶中国人不都这么干嘛。你看,但是在这个科学领域的话呢,西方呢,绝对是成体系化的在往前推进,咱们呢,就是一些星星点点的一些成就啊。好,那这呢是我们呃闪光的一个点,所以呢,我们这块呢,起这个名字的时候呢,咱就可以又叫拼音了啊阳辉是吧。终于可以用贫了啊。啊,它的一个test。好,没方法进来啊。
23:02
好,那他让我们输出这样一个特征的一个呃数据啊呃,那么有没有同学可能会去想啊,前面我们作为一个叫局部乘法表。呃,感觉好像也是啊,一行一个俩三四往后推哈,那个直合转化表呢,咱们根本没有用数组。我们直接呢,就两层放循环就搞定了是吧,诶为什么那个我们不用数组这块呢,突然就用数组了。想想。嗯,对,哎,刚才提的是对的啊,就是你看我们讲这个这个乘法表的时候呢,我们上面是一乘一,这二乘一二乘二,下边这个算式跟上边这个算式,或者跟其他的算式。没有任何关系是吧?所以我们就直接写for循环,没有任何依赖性,你就直接做就行了。这个为什么想着用数组呢?因为你要是想计算这个数呢,它得需要依赖于别的东西。而别的那个所谓的东西呢,你你得你得做好做好我要用是吧,那为了方便用,所以我们就得拿一个容器给它先装起来。
24:02
然后呢,方便你再去用,所以我们就得有这样一个容器在啊。那这个思路呢,大家想一下啊,好了,那咱们就来搞定这道问题了啊,首先啊,涉及到就是。他提到一个就是十行的啊,阳为三角。那首先的话呢,我们需要把这个数组给它创建出来。创建。这个,哎,这个二维数组。那么这个二维数组,你得想清楚我们怎么去造啊。那咱既然说到这,咱就造一下吧,元素呢都是int类型的,所以int型的二维数组咱叫就叫阳灰了啊哎,因为一个int型的二维数组,这个呢,关键你看我们用哪种方式啊。有说,我直接就得写到这儿。那这道题就结束了,就是吧,哎,这写一个一,然后这块来一个一逗号一是吧。然后这个逗号一下,呃,这个写一啊121是吧。一行就搞定是吧。
25:00
啊,那就破坏这道题的初衷了啊,你要这样写,说明你还没有这个编程的思维啊,真的,你咔咔的自己一顿去操作,多累啊。要计算机的目的不就是让他来做吗?是吧,所以你不要在这儿写哈。那我们就得用动态了啊,十行这个位置可以写十。这个呢?没法写是吧,对,因为每一行对应的列的元素不一样啊,所以这个一定不能写。好,这是我们的第一步了,第二步呢?诶,这个呢,你光有十行,每一行或者说每一个外层的啊,这我们分成有十个了啊,这里边儿是不是都是no啊。所以下一步呢,你是不是要把对应的这个外层的这个元素给它初始化。现在我们就,哎初始化。这个外层数组元素啊,就是把这个每一个里边的这个外层的元素,这个数组呢给它造出来,这呢有十个我们得使用循环啊。啊,使用循环。结构啊。
26:00
哎,初始化外层数组的元素。就是总归一个方向呢,我们现在要把这个数字呢,先给大家造出来啊,那说到这儿咱们就就整吧。In的I等于零,I呢,就小于这个怎么写?十行是吧。杨辉点烂死呗,哎,佳佳。好在这里边儿啊,杨辉。I是吧,它呢,每个位置其实都是no啊,我们都会给他去扭出来一个意味的数组,这个位置写。I加E。哎,第一行这个呢,你是一个元素啊,零加一,第二行啊,一加一两个元素OK了,这这样的话呢,我们通过一个发循环,我说一下这个整个这个数组呢,整个这个型我们就给称出来了。乘开以后的话呢,如果说此时咱们去遍历这个二维数组的话呢,里边其实也有元素。因为都是零吧。对的啊。好,这块我们就先,哎这个便利一下啊。
27:00
哎,杨辉I点。在这里边直接打印啊杨灰。I。接是吧。嗯,这块呢,咱们让他稍微来一个制表符吧。然后这个呢,就不要换行了。哎,出来以后呢,换一下行,哎,差不多哈。没问题,来跑一下。好,那么目前呢,我们看到的效果呢,其实就这样子了。行了,那整个这个框呢,我们撑起来了,那对应的我们这个第三步呢,也很明确,就是给数组的元素赋值了。哎,只不过这个赋值的话呢,我们有两种特点的哈,第一种呢,就是给数组。呃,咱叫美行吧。形象点说啊,给数组中这个每行的首末元素赋值为一是吧。这个呢,相对来说比较简单。3.2给数组每行的。非手墨元素。哎,复制。
28:01
诶复制啊,这个呢,就稍微的复杂一点。好,那看看啊,嗯,每行的首末元素每行有十行,是不是又得涉及到循环了。这个对吧。是吧,嗯,这这十行,呃,我是新整一个,还是说我能整到这里边呢。其实呢,我说呀,我顺带着我就。给你附上了,你看诶是不是挺好,你看。啊,诶这个怎么做呢,你就把它呢,就选中啊,你你挂个边就行啊,然后呢,按照这个out shift上。啊就过去了,然后呢,点点一下tab键。哎,往后缩紧。挺好是吧,好就到这儿啊,我呢,诶把你第一行数组造出来了,造出来的同时我就顺带着给你就附上去了。啊阳呃灰这个呢,首元素呢,就是第行的零个元素是吧。复制为一。
29:00
诶,墨元素。诶,墨元素咋弄。对接等接等接啊接,这还没接呢。啊啊。得接在这儿呢,哈哈。对,其实呢,就是这是第一啊,这个角标一的时候呢,这是一零,这是一一,这是202122,你发现呢,就是这个所谓的这个列哈末元素就是这个列。也交个接吧是吧,跟我们这个I呢,其实相等是吧。所以说这块,所以这块呢,我要是写上一个I的话呢,我这个我就直接也写上I了。是不是就行。OK啊,诶把它呢也复制为是个E。啊,你可能会说呢,说当第一行的话呢,这是一,这不就是零零不重了,重了就重了,就这一次重,下一次就不重了。行,那这个呢,你写成这样也行,或者我直接呢,我就。这样是不是就连续复制了。也可以啊。来转一下。就是边框就出来了。
30:01
好,下边这个重点呢,就是我们给这个赋值了啊,这个赋值能不能放里边啊。部长。再想想。还是不能再想想这就是,直到你说能的时候,我们就是吧。嗯。可以啊,呃,因为呢,你看啊,假设我们给这一行赋值的时候啊,我现在这个,诶把这一行我创建的时候呢,这不是长度为三,诶我这写个一,这写个一,中间这个二的话呢,它不依赖于后边啊。它直接呢,依赖于前边,我这不是用你前面这俩不就出来了吗。你看这一行的时候呢,诶这个手摸出来了,这俩呢,这不就也可以依依代你前面的就出来了。就可以是吧,诶所以说这块的话呢,我们其实是可以把它呢移到上边的啊。往上移tap一下。哦,这个一行的话就不行啊,这样一下啊。好,那么这个打中看看。非守墨元素可能有多个。
31:01
比如说啊,一个两个三个四个五个六个是吧。啊,那这时候呢,其实就是咱们先稍微找找感觉哈,阳辉这个呢是第行了,第二个元素呢,是角标一是吧。可能有第三个,也可能第四个,也可能第五个,这个就不确定了。这个是不是得。嗯,对,最大的得到A减一了是吧。对,那你问题是这块呢,我们是不是得拿一个变量来去表示了一下呀。那这块我就得是不是整个for循环了呀。啊,For一个接同。一开始吧。这个来刻画列的是吧,呃,第二列,所以从一开始,然后接呢小于。哎,杨辉。I。这是我们到结尾了,减个一吧,得。啊对错了点less是吧,减个一是吧,然后接呢加加。这个呢,就是从第二个元素开始。
32:02
这个我在这写一下啊,接呢从哎这个接啊从。这个每行的。呃,第二个元素开始。打。倒数对。倒数。第二个元素结束。那这个我们刻画的话呢,就是这样的一个范围,那么在这个范围内。怎么钟?这个呢,不就是这就写成这个叫接了是吧。哎,这个呢,下边其实我们这个公式啊,其实哈,就是杨辉。嗯,它的上面。嗯,I减一。接是吧,上边的左边。I减一接减减一,哎是这样写是吧。然后呢,这个接加加,然后呢,接着就后一个元素啊,一直走到它是倒数第二个元素,诶这样。哎,好像。
33:01
完事了是吧。感觉有点快。诶,同学想说这块这个用不用加个条件。你看我们现在是I等于零,每一行相当于都有这个事儿。每一行都有这个事儿,但是其实你会发现呢,是I从第2I等于二的时候才开始出现的是吧。有同学说说这样写好像不行,有点问题哈,我得加个东西,加什么呢?我加上这个I呢,它得大于等于二的时候才开始考虑这个事儿。嗯。看看这个。第二行的时候,Ii大于等于二了,确实是从这个I是二的时候呢才开始的是吧。加上行吗?先说。加上其实行,你看下我们这个结果啊。其实这块呢,就已经出来了。那是不是也没问题是吧?呃,那另外来讲的话呢,如果要是不加呢。
34:00
对,你发现的也行,你看我们run一下啊。对,你看这也行。对,哎,解释的就是,诶刚才同学说啊,就是因为呢,你如果要不加,确实呢,是I等于零的是也考虑了,但是呢,这个皆是一,这个阳灰I这个是不是就是一个元素啊,一个元素减一个一,这不就零嘛,啊一小于零,嗯,没进去。然后你第二行的时候也没进去啊,第三行的时候呢,才开始进去了。所以说我这块不加它呢,也是可以的啊。行,那杨辉三角这道题呢,就这样来做。就完事了啊。啊,这个大家看有没有问题。没问题是吧,好,那这儿呢,我们就以洋灰三角为例,说了一下给元素赋值的这个事儿,那么在实际开发当中啊,或者说这个大家在笔试当中啊,有可能还会考察你其他的一些赋值的问题,我在这个课件里边呢,留了一些题目。啊,这个我们就往下稍微捋一下了哈,这个事儿的话呢,咱们一会儿再说这个。
35:00
嗯,比如说。比如说这个吧。说创建一个啊,这个就在这儿了啊,大家下来的话也都能找着,说创建一个长度为六的int型的数组。都告诉你了啊,说要求数组的元素的值在一到30之间。哎,并且呢,是随机复制的。哎,唯一的要求就是元素的值各不相同。简单不?大家犹豫了,那我觉得还挺好的。诶,为啥呢?因为你要说简单,诶看着挺简单的,但是其实你真赋值的时候,你发现它还是有一点难度的哈。诶长度呢,告诉你了,其实这个造数组的事儿呢,极简单啊呃,随机数呢也比较简单,这个这大家都会,关键就是我们在复制的过程当中啊,负了第一个没事,负第二个时候呢,需要跟第一个。比一下是吧,不相等了没问题,第三个第三个的时候需要跟第一个和第二个呢比一下啊,以此类推,如果他要是不相等,接着往后走,如果要相等了。
36:01
得重新付是吧。这个重新付呢,你注意哈,是这个重新付,还是我又从第一个元素重新复。就付他就行是吧,对,以前有同学写这个算法的时候呢,每次出现相同又从头来了。啊,一运行发现,你看我这也很快一下就出来了,人家那个也一下出来,但是你是因为CPU太快了是吧。啊,其实呢,你这块每次不要从头来了啊,哪个重复了你就从哪个来就行。行,这个呢,其实你也可以看成是大家买这个彩票的时候呢,呃,就有这种机选号一样啊,就是六个号。啊,然后呢,这个是一到30之间的不重复的,诶一随机生成诶就出这个问题了。诶下来呢,有兴趣的你可以写一写,这个我就不写了,时间关系啊,所以这个呢叫便利扑克牌。哎,变了扑克牌,那这时候我们就可以考虑呢,把它呢,就是放到我们对应的数组里边了,我们可以基于现有的两个数组,一个呢就是这个花色的,一个是这个具体的数值啊,我们把它拼一起。是吧,拼一起就可以了。OK啊。
37:01
好,那么其实呢,还可以有其他的题,就是说三个人玩。发牌随机发是吧。啊,然后发完之后呢,哎,这个你看每个人的排是什么,还可以再难一点,发完之后呢,再排个序。有点意思是吧,哎,这个呢,我记得我课后的那个拓展的练习里边,呃,题里边有类似的这个题目啊,有兴趣的可以整一整。还有一个这道题。这个叫回形术。哎,这道题呢,是从哪拿的呢?是以前呢,有个同学呢,去笔试的时候呢,哎,不是去公司去面试了啊,面试的时候呢,上来就先给他整了一道。其实这是面试的时候。问了他啊,笔试呢就没有了,就大家去工,这个找工作的时候呢,有的公司一般的啊,我们说可能会有个笔试,但是也有很多公司呢,就根本没有笔试,上来就直接面试啊。啊,结果呢,面试的时候呢,给他出了一个算法题,说诶,你看这个题你会不会啊。哎,说呢,他没说叫回应数了,直接就说的需求,说呢,我们输入一个数。然后这个数的话,输完之后呢,我们就会打印出来一个行列呢,都是这个数的一个矩阵。
38:02
哎,那么这个数据呢,是有这样的特征,比如我输入的是一个三。嗯,那它就是这样子的啊123。啊,四五。啊,6789啊。这个你可能没感觉啊,然后四的话呢,这样啊,呃,1234。然后567是吧。嗯,八九十。嗯,十一十二。13、14。啊,这样。哎,完事。这一层层往里边这个绕是吧。比较回形数。哎,说呢,你能不能写个代码实现这样特征的一个数据。啊,那个同学看了看说不能。然后呢就结束了,过去呢,花了一个小时到这个公司,然后十分钟出来了是吧。出来就出来了,下一家是吧。诶,这跟高考不一样,高考呢,你要说完了啊,那得是下一年了是吧。嗯。诶,所以找工作这个事儿呢,大家不用特别的紧张啊,这个公司不行,那我就下一家,谁能保证100%中呢,我觉得没有人能做到的啊。
39:03
再者,你说我面试的时候呢,说哎呀,他要问住我,我多尴尬呀,哎,那我告诉你,是的,你俩换一下角色,你变成面试官,你也能问他。你就逮这个问题,你问为什么。他解释了之后,你说为什么是这样的呢?他才说那为什么这个就是这样子的呢?问着问着他基本上就不行了,是吧。所以你要问住人啊,很很容易的哈,关键就是你是第一个问题问为什么就给卡住了,还是问到第三个卡住了呢,还是说第五个卡住了呢?你的深度不一样是吧。好,那这个题呢,还是啊,这个就不讲了,我觉得这个题呢,也就抛一抛,让大家知道有这么个事儿哈,呃,下来的话呢,我觉得这个就。呃,你要是前面这个基本的问题还不清楚,这个就别做了,诶,如果基本问题已经很熟了啊,这个一位数字二维数字六个知识点都很好很熟啊,直接呢,可以下来找找感觉,来稍微练一练啊,拓展拓展你的这个思维能力啊。好了,哎,这么关于数组元数赋值的事儿,咱们就说完了。好,那我们接着来看下边的练习啊,下边练习的话呢,是该第四个了,这呢我们来看这个T啊说这里边呢,涉及到了一个题目,这个题目里边呢,其实就涉及到了关于数组的一个复制的一个操作啊,或者稍微的总结一下呢,应该是这样的两个词啊,一个呢叫做复制,一个呢叫做复值。
40:16
哎,稍微的这两个呢,是有点儿区别的。哎,这个有点咬文嚼字的意思了啊好,那我们具体来看这个题目,这个题目做完以后的话呢,我们来看看这两个不同的这个操作,好这块呢,提到了12345这样的几个步骤,其实呢,就直接按照这个步骤呢,我们去写就可以了,所以这块我们直接呢创建一个程序啊叫瑞。啊,一一咱们是零四啊。好,然后呢,在这儿呢,我们写一个没方法,哎,下边我们来写一个具体的这个代码了,把这几个呢,我们给大家注释一下。这样啊。好CTRLY啊把这个就删掉了,整个这一块的话呢,我们shift加tab往前移一下移不了了。因为这块有个他了哈。
41:01
哎,稍微的,我瞧一下这个格式啊。对,因为我注释了,他可能这个他看不出来,但是我这个哦,Tab tab这样可以是吧。这个对shift加type是往前移了啊,我点type往后移啊,行来看一下我们这个第一个啊,说创建一个test的类,这个跟他们那个名不一样,那把它这个给改了吧。说在这个may方法当中啊,说声明A瑞一和A瑞二的两个变量,它们呢是int类型的数组,哎,这个比较简单一些,首接我们就int型的一个,哎,数组是吧,哎,A1逗号啊,A2相连,这两个变量呢,共用一个类型。诶没问题了,说下边呢,使用这个大括号把俄瑞一的初始化啊作为八个数啊,相当于呢给俄一呢作一个赋值啊,那这时候我们瑞一啊这边右边呢去赋值,注意我们现在这个声明和它的初始化呢写成两行了,那这个时候的话我们new。啊数组对这个呢,你就不要给它省略了。
42:00
哎,把这个呢,我们CTRLC啊粘到这儿就行,诶我说的呢是这个事儿啊,如果呢,我们要写在一行上的话呢,这个是可以省略的。这是第二步,第三步说显示A1的内容,那其实就是一个便利操作了。哎,我们这哎就比较简单一些啊,二瑞一直接呢,我们去编利一下啊,这个位置我们就打印一下A瑞一要标I啊,然后我们这块来一个杠七吧,哎,这个位置我就不给大家换行了,这个1.length啊。哎,它的长度好,这呢就是一个比较简单的一个便利操作啊,这个呢大家应该要熟悉啊,来这块我们先把它运行一下。嗯,没有问题啊,这样的话呢,它这个数据呢,就都出来了,好,那么看接下来说呢,赋值俄瑞二变量等于俄瑞一,并且呢,要求修改俄瑞二中偶索引的元素啊,这个我们一个一个来啊,首先的话呢,它叫赋值二瑞二变量等于二瑞,其实呢就是。这样的一个操作是吧。诶对,这就是一个复值操作,咱们前面呢也做过相应的练习哈,正态俄11和22呢,你看它俩的类型是一样的,所以呢,是允许我们有这个复值操作的啊。
43:05
好,那么接下来他说修改瑞二中偶索引的元素,使其值等于其索引值,那比如说咱们这个索引为零的这个位置呢,哎,就把它复制为零,索引二的位置呢,就复制为二啊,只改这个O索引啊。行,那这样的话呢,我们也这个得看看它一共有几个,那其实也是通过这个便利的方式,我们去做这个操作的,诶所以接下来我们还得这样啊,For一下,这个针对的是这个二啊,点length一下。好在这里边呢,去判断啊,说如果呢,这个索引呢,曲目二呢,等等于零,那说明这就是偶索引了。哎,然后呢,我们把这个二为二,那角标I的位置呢,复制为I就可以了。比较清晰是吧,哎,只改这个哦索引嘛。那这个呢,我们就改完了,哎,那改完以后的话呢,他下边又说说你打印一下a re一看一下它里边这个内容,那这个呢,其实就是个便利的意思了,所以我把这个a re1呢,哎,再给他诶便利一份。
44:03
好,这个便利之前呢,因为前面我们这也没换过行啊,所以这块的话呢,我们再打印就跑到一行上去了,这块我们做一个换行的操作。诶换行这个操作行这个事儿呢,我们就完事了啊好,这个呢,整个思路呢,我们稍微捋一下,说呢生命了两个变量,然后A瑞一呢附了个值,然后呢打印一下它的内容,然后呢把这个瑞一呢复制给俄瑞二了。呃,接下来的话呢,咱们改的是瑞二。改完俄瑞二之后呢,我们再打印去瑞一。啊,按正常来讲的话呢,你看我打印俄瑞一没问题,然后呢改的是俄瑞二,然后呢再打一个一,似乎呢,他俩应该是一样的是吧。哎,但是呢,咱们发现呢,最终的这个结果,这呢打印的是A瑞一,这还是俄瑞一,但是瑞你的这个值呢,你发现变了。啊,那这时候呢,我们能分析出来是为什么造成这样的一个情况不。
45:01
对,关键的就是看这个位置啊是吧?对我把这个瑞一呢,复制给俄瑞二之后呢,如果说啊,大家看这个时候呢,如果我们要打印一下俄瑞一,打印下瑞二,你说打出来的首先打印的是什么。地址值对啊,那么它俩的地值相同吗?相同,对那这块我们还得有个换行是吧。来走一下啊好,那这时候呢,我们发现呢,它们俩的这个地址呢,是相同的,哎,那相同的地址值意味着什么呀。对。咱们讲这个内存结构的时候也提到过了啊,咱们这个方法里边这写了一个may方法啊,在方法里边定义的这个变量啊,咱们讲面向对像的时候呢,就明确了,这叫做局部变量哈,这个局部变量的话呢,它是存在咱们这个占空间里的,然后真正我们new的这个数组呢,放在堆空间里了,所以呢,你这里边的A1,然后A2,首先呢,他们指向的都是数组啦,但是它俩的地址是一样,那就意味着它们指向的是同一个数组。哎,对,因为它是同一个数组了,导致呢,我们改这个瑞二的时候呢,瑞一也跟着就改了。
46:06
诶,所以这块呢,大家你看我这儿提前已经画好的一个内存结构图,这呢就是咱们刚才做的这样的题目,黄色的就是这个核心的操作啊,把A瑞一你保存的这个数据呢,给了瑞二,你存什么你就传什么。我存的呢是个地质值,所以你传的呢,就也是一个地质值。哎,进而的话呢,它俩指向的是同一个数组。所以你改瑞二,其实改的就是瑞一。哎,所以这个结果呢,你打印瑞呢,就也变了。OK啊,但如果说呢,我们这个操作,哎,看成是一种负值的话呢,这个咱们也只能叫赋值。不能看作是我又复制了一个二一。是不是不能这样?对的啊行,然后你再看我们这个题目的一个思考啊,思考它俩是什么关系,这时候呢,我们说确实呢是两个变量。然后呢,这两个变量呢,你发现呢,它指向了堆空间中的同一个数组结构,哎,所以这块的话呢,就它俩的地值一样,这个呢,不认为是一个俄瑞二对俄瑞一数组的一个复制,好那下边的问题,那我们如果就想瑞二对俄瑞数组进行一个复制,该怎么去做呢?
47:13
对,我就想复制一份啊。咋整?得用一个了是吧,哎,对的啊,行,那这时候我们再去新建一个啊,我们叫R。哎,它嗯112,这个我们叫零四_一啊,比如叫它了,行,你看这样啊,我把这个代码呢,原封不动的,咱们还粘过来,从这个may方法这块。At what can?嗯,你看这块我粘过来啊,粘过来以后呢,前面这块呢,你看都不用动哈,从这个位置开始,我们说得改一改了。哎,这个时候呢,我们是叫赋值,这个变量等于它,那其实这个不能这样写了,我们说呢叫复制。哎,二一这个数组。啊,然后呢,这个命名为是吧,瑞二哈。啊,或者叫赋值瑞这个数组给这个瑞二。
48:00
哎,这样啊,然后呢,我们再去改俄瑞二中哦,索引的元素好,这个呢,你看我叫复制啊,这个事儿的话呢,我们说相当于呢,我们希望呢,你在这个堆空间当中,人家一开始的时候,这个俄瑞一啊指向了一个数组,说呢复制一份,那就意味着你得完全的造一个新的啊,哎,只要你造个新的呢,咱们说都得是new。哎,所以说这时候呢,我们得是A2啊,然后呢,真正的去new一个数组是吧,那new的这个数组的话呢,要求跟原有的数组的长度啊,内容啊都是一样的,那这时我们应该怎么写。有没有同学说中国就这样写,我就把他这个声明呢,直接这样粘过来。是吧,这个靠谱吗?不能这样去想啊,就这个话呢,又没有这个编程的思维了,就这块儿呢,相当于你就给写死了啊,就上面这块我要动一动呢,你下边这个呢,没变是吧,我们应该是什么呢?我不管你是什么,这个呢,哎,我就动态的去创建一个跟你一样的。哎,所以这时候呢,我们不能这样的给他写死,而是呢,应该选择呢,我先造个数组跟你的长度。
49:02
诶是不是一样的是吧,然后呢,我再把你里边这个内容啊,是不是一个一个的都复制过来。哎,所以这块我们写一个for循环啊,这个呢,我们就写一也好二也好都行了。嗯,它们的长度,然后A位二里边呢,每一个元素,就让它等于A位一里边的每一个元素,哎,这呢,是不是就是一个复制了。诶,对的啊行,那么这个复制完以后,那如果说我们去打印一下他们二者的地址,这个地址就。不一样了,对,这就说明指向两个不同的数组了,那进而呢,我们再去改俄瑞二,你再去打俄瑞一,瑞一就不变了是吧。好,此时呢,你看我们去做个运行。好看一下啊,此时的这个俄瑞一长这样,俄瑞二呢,你看地址就变了,所以呢,你一开始的瑞一长这样,然后呢,你改了瑞二之后呢,再去打瑞一还是长这样。哎,这就没有任何的影响了,所以呢,看这个内存结构啊,这个还是咱们提前我已经把这个图画好了啊,在这个图当中呢,本身这个一啊,它指向的是这个数组。
50:02
哎,说现在呢,你俄瑞亚呢,完全复制了一份跟俄瑞一样的。那复制完以后的话呢,你再去修改这个二的话呢,那你改的就是这个位置了。哎,这样啊,然后呢,你不会影响我们原有的这个数组。OK啊,这是我们说的这样的一个思路啊,这就清楚了啊行,那我们这里边呢,就把刚才写的第一个这种方式呢,可以理解成是一个负值。哎,而把这里边儿的第二种这个操作啊,真正我又重新拗了一个数组,然后呢,做了一个循环复制的一个过程,这个呢可以理解成叫复制。哎,我说一下这两个操作呢,其实有点像我们平时在在电脑当中的一个操作哈,举个例子,比如说咱们前几天那个代码的话呢,咱们不都写到这个。哎,应该是这个里边了是吧,好你看这呢,如果看作是啊,这个Java code的,如果我们看成叫A1的话啊,我一双击,大家可以把这个呢,咱们暂且理解成就是数组指向对空间的这个内容的实体了。
51:01
好,那你看啊,我现在呢,点右键,我这有个叫发送到桌面快捷方式。好了,那这时候你再看这个桌面哈,这呢有个叫Java code的,哎,那么这种方式呢,类似于咱们刚才里边的哪一种哪一个写法。哎,第一个是吧,对焦赋值的啊,也就是说呢,咱们这时候的这个桌面上的这个Java后呢,相当于是A2它呢,一双击是不是也指向了同一个内存中的这个对空间中的数据了是吧。那就意味着如果从桌面上打开进来的,我把这个呢,我给删了。别删了,删了有点猛了,咱们新建一个吧,我建个123是吧。好,那么这时候呢,如果你再通过我们这个,呃,这个电脑这个D盘这块,你再打开这个Java code的是不是也有123。对,因为他俩指向的是同一个嘛。啊,这个呢,就没有问题了啊,那怎么体现呢,叫复制呢。哎,这个你比如我把它这个就删掉这个变量,这没事哈,哎,这个还是有的,然后呢复制就是说你把它选中以后呢,真的是右键,这叫复制,然后在桌面上呢,我CTRLV一下。
52:05
诶,你看有了在这儿呢是吧,好,现在的话呢,我把桌面上的这个Java扣的,我打开这里边儿有这个内容,我把它呢,我就特别放心的,我就删了。不要了是吧,那这时候我们再去打开咱们D盘下的这个变量,是不是里边还有。对啊,这个操作呢,不就类似于咱们刚才里边,哎后边写的这个吗?因为真正让我复制了一份了,那你复制品你愿意删你就删,不会影响原来的。啊,因为它内存空间呢,是两份了。OK啊,那区别呢,就在这儿,像这个呢,是咱们说的这个数组的一个复制的这个操作啊,大家呢,熟悉一下啊。
我来说两句