00:00
大家好,我是上硅谷H5学科讲师刘志远。在成学期到来之际呢,给大家分享一道面试题啊,这道面试题呢,叫做反转数组。那首先呢,我们先来定义一个数组啊,VR,然后AR中括号。好,我这来一个一逗号二逗号345678啊,比如说呢,现在数当中呢,我们有八个元素,分别是12345678,那接下来呢,什么叫做反转呢。那我们来画个图。好在这儿呢,我来一个啊,这么一个正方形。然后呢,在这个里边呢,我们我这样我来复制这么几个啊。二。八再来一个放在这儿。
01:01
好,那这里边儿呢,分别我们就写上啊,这是一。二。三。五。OK。好,那此时我们认为什么叫做反转呢?就是让我们的第一个元素。啊,让我们的第一个元素和谁进行交换呢?和最后一个进行一个交换。然后呢,第二个和倒数第二个进行一个交换。然后呢,第三个和谁呢,和倒数第三个进行交换。然后第四个和。
02:00
倒数第四个进行一个交换。好,那通过这几次交换呢,我们会发现我们的数组呢。以反转的形式呢,进行一个逆序的排列。那此时呢,我们找一些规律啊,看我们如何来用,通过我们的程序来实现。首先我们可以认为啊,我们当前到底有几个元素呢?是不是一共有八个呀啊,所以在这呢,我们来标识一下啊,那也就是说认为是一个叫做数组的啊元素的个数吧。那元素的个数我们是不是可以通过我们数组的长度能拿到呀,那也就是a.lengths对不对,这时候我们元素的个数,那我们再回想一下刚才这个过程呢,我们交换了几次。那我们一共有八个数,是不是交换了四次啊,一次,然后两次三次四次四次对不对好。那我们是不是可以认为啊,我们交换的次数呢,是我们长度的一半。
03:02
哎,所以在这呢,我们还是来标识一下啊,这是交换的次数。交换的次数其实就是我们元素个数的一半,是不是?我就说长度的一半,那应该是a.length。然后除以一个二是不就完了。那我们需要谁跟谁交换呢?那我们刚才说了,是不是第一个跟最后一个。然后正数第二,倒数第二,正数第三倒数第三,正数第四倒数第四,那这个过程啊,那我们想拿到数当中的具体的哪个元素应该通过我们的索引值是不是啊,那索引值呢,我们认为。是不是就是D0个呀。好,这是第两个和谁呢?和我们元素的最后一个,那最后一个是。索引值是多少?啊,最后一个索引值是不是就是我们数组的长度减一,我们认为实际叫做最大索引值吧。
04:01
好,那我们是不是可以认为是这样进行一个交换方式啊。我们需要啊,零。数组是零的,和谁交换呢?是不是a.Les。减一对不对好。那现在呢,我在后边呢,我再写个减零。诶,这样写可不可以啊,哎,我们说任何数啊,减去零的话还是任何数,所以呢,我就先减个零,为什么这么写呢?我们继续看啊,那接下来应该是。是不是我们第一个元素和谁交换呢?是不是应该和我们倒数第二个,那倒数第二是不是就是a.Les。减一,然后再减一。诶,那再往下啊,把它拉长一点。好,那再往下走呢,应该是我们。啊,所以值是二的第三个元素和倒数第三个,那倒数第三是不是就a.length。
05:00
减一,减二。好,再往下走,那就轮到是谁了,这个五了是不是。那就是刚才我们看到是四啊a.Les。然后呢,还是减一。减一,减三。那么可以认为啊,经过我们这四轮的交换啊,那此时数组就应该是一个反转后的逆序排列了。好,那通过这三个值,我们发现它们之间其实是有关联的,我们就可以做。反转的这件事情了。那这里边儿呢。反转的这个次数。交换的次数呢,我们肯定得用到负循环,是不是好在这我这么来写啊,好负。VI好,I等于零,然后I小于什么呢?那我们说这个循环呢,是不是就是一个交换的一个次数啊,那次数是不是就是一个a.Les然后呢,除以二是不是就OK了。
06:04
然后每次呢,哎,来一个自增。好,那每次循环需要怎么来交换呢?那我们来看一下啊,首先在第一次循环的时候呢,那我这中括号写个I,那首先它是不是就是零啊,它需要跟谁交换。我在这儿,我们标识一下啊。好,他是不是要和谁交换,是不是和我们的最后一个呀,最后一个是不是就是AR中括号,然后呢。那。最后一个就是当前的数字当中最大索引值是不是,那就是通过a.Les减一。是不是就可以拿到呀。好,减一就可以拿到。再继续啊,那第二次呢,当我们的爱发生变化的时候啊,那我这我就这么写了,这是零啊,然后这应该是一了,是不是。好,那此时呢,那刚才我们是不是这么写的,第一个我们人为的给他写了一个减零,然后在这呢,人为的写了一个减一。
07:03
诶,发现是不是就是这么一个过程啊,那一共是四次交换对不对,那现在我们是二,相当于跟T交换了,下一步呢,我们希望。三和六交换,那我是不是再复制一份。好,索引值呢,如果是三呢,哎,如果二呢,就是我们。三第三个这个元素,那这块呢,是不是应该是减二。好,那再往下还有最后一轮呢,是不是就四跟五呀,那我再复制一份。这该轮到我们,所以知是三了,也就是我们第四个元素和谁呢?和我们的倒数第四个,那这再减一个三。好,那倒数第一倒数第二,倒数第三倒数第四。是不是这么来算的?好,那此时啊,那此时我们这个工作其实就完了。那接下来呢,我们怎么来实现呢?那我们希望啊,我们的变量,我们可以看成是一个变量吧。那我们希望两个变量的值进行一个交换,那此时呢,我们要借助第三方变量。
08:02
还有一个呢,那我们我会发现啊,这第一轮是零,那其实我们说这是不是就是I啊,这也是I,这也是I,这也是I,那对应的我们看啊,我们的最大索引是减的,是不是就应该是I。诶,所以这下就出来了。那好,那最后一步呢,我们要借助第三方变量。变量交换。交换两个。变量的什么值是吧?那我们应该这么写VR。等于什么呢?A中括号I。好,第一次,那肯定是我们。所以你是零的一个元素。好,然后呢,A中括号I。好,我们需要把谁复制给他呢?最后一个。所以是a.Les减一,然后减。那再往下呢,是不是应该是AR中括号AR点四。
09:04
减一,减二。把谁复制给他呢?是不是就是我们的time?好,那这步操作呢,是我们最基础的交换两个变量的值,借助第三方变量对不对,所以此时呢,我们就可以实现一个速度的反转了。那接下来呢,我们打印一下啊,通过can.log打印控制台日志的方式呢,来打一下这个数组,我们看一看是不是变成8765321了。好,此时我们运行一下走。Or after?好,我们可以再刷一下啊,A87654321没有问题,那此时呢,当你元素个数再增加或者变数的时候呢。都是没问题的啊,那这就是我们的数组反转。
我来说两句