七月在线公开课笔记-三十六-

七月在线公开课笔记(三十六)

人工智能—面试求职公开课(七月在线出品) - P1:O(N)时间解决的面试题(上) - 七月在线-julyedu - BV1Xf4y1r74s

欢迎收看7月算法公开课。我们这堂课的主要内容是ON时间能够解决的面试题上因为题目比较多,我分了两部分来解决。那我将从如下几个方面讲述本课,先讲一下简介,再讲6个例题,最后总结结束本课。

本课其实例题是最重要的。我们来看一下简介。就是问一下ON是什么东西,注意N是什么?N是问题的规模。我们需要考虑,比方说如果输入是一个图的话,N到底是节点还是边。因为如果图比较稠密的话。

也就是说边比较多的话,那么边是节点的平方的级别的。所以如果我们认为这个ONN是边数的话,那其实对于节点数来讲,它已经到N方了。所以我们必须要注意这个自变量是什么东西。

我们说的线性是针对于什么输入是线性的。通常情况下,我们应该认为图的节点是N边是N方的这种级别。所以大家一定要注意,不要说这个题ON就完了,要注意这个N具体是什么东西。

那方法上其实ON最简单的理解就是扫一遍线性的嘛,循环N次,其实还有很多其他类型的,比方说两头扫,这个也比较常见。然后呢,虽然是双重循环,但是内重循环里面循环变量不减小。

也就是不是说每次内重循环都是从零循环到I或者从零循环到N的,而是。它不减小,它不断的再往上加这样虽然是两个循环,它也是ON的。所以对于ON的理解并不是简单的数一下循环个数就完了。

还要看一下它真的总体上循环多少次。😊,那对于。队列和对战我之前也提到过,他有单调的队列和单调的对战。我们利用这种单调性可以巧妙的把复杂的问题变成简单的问题。

这种可以做到ON时间完成我们之前似乎做不到的事情。所以这个是总体上的一个简介。我们下面就可以来看具体的问题。第一个提是,名人问题,也叫社会名流问题。他说的是什么呢?输入是N乘N的一个矩阵。

连接矩阵表示A和B是不是认识,也就是它的第I行DJ列表示I是否认识J。如果I认识J。就是一I不认识这就是零。当然我们可以把它理解为一个二进制的矩阵,或者说理解为一个布尔的矩阵。

而是对角线上的元素我们可以不关心,就是对于自身认识不认识自身这种问题,我们不关心。😊,那。告诉你这个矩阵不是对称的什么意思呢?就是A可能认识B,但是B不认识A。

也就是A认识不认识B和B认识不认识A没有必然的联系。所以他不是一个无像图。换句话说,他是一个有向图,A到B有边,不一定B到A有边。那么我们怎么定义什么叫名人呢?名人就是他不认识任何人。

就是这些人他一个都不认识。那除他以外的那些人呢都认识他,那么这样的一个人,我们叫做名人,给你这个矩阵,请你求出来所有的名人,注意是求所有。😊,其实这个问题这个所有也是吓唬人的。我们可以想一下。😊。

最多能有多少个名人存在。当然有可能没有名人,就是每个人都认识其他的人,那就没有名人嘛。所有人互相都认识,那显然就没有名人。那最多其实也就只有一个名人。大家可以想一下,如果有两个名人的话。

你可以想一下他们互相认识不认识。如果有两个名人A和B。那如果A认识B的话。那显然。这个A就不是名人,因为A不能认识任何人嘛。那A不认识B的话,那B就不能是名人,因为名人要被所有人都认识。

所以这个求所有名人完全是吓唬人的,最多也就只有一个名人。啊,最笨的办法,显然我就是看对每个I看一下JI是不是认识J。如果不认识的话,看一下J是不是认识I,反正就用这个定义来看嘛。I不认识所有的人。

并且所有人都认识他,那么它就是一个名人,那这个算法的复杂度是N方的。因为两个循环嘛,直接那样循环的。😊,那我们今天的主题是ON的,我们看一下有没有更简单的办法。其实刚才已经说了。对于两个人来讲。

I和J如果I认识J的话,则I它显然不是名人,因为名人不能认识其他人嘛,那这个I就没有意义了。我们可以删掉I。那如果I不认识J的话。那J显然不是名人,因为名人要被所有人都认识嘛。所以无论I认识这也好。

挨不认识这也好,我们都可以扔掉一个肯定不是名人的人。那这样不断的扔下去,最后就剩下一个人了。我们看一下。这个剩余的人他是否是名人,这个就用定义看一下,最多循环N次嘛。所以这个算法的时间复杂度是ON的。

当然我这个算法的描述其实可以理解为是一个自然语言描述的算法,它还是有一定的模糊性的。我们可以看一下后面有几种实现,说的都是这一个意思。我们看一下最简单的。😊。

这个实现我们用一个数组保存没有检查过的人的编号。那刚才说了I和J。如果I认识J的话,删掉II不认识J的话,删掉J。我们关键是怎么从这个数组里删掉一个元素。那删掉一个元素。

显然我们可以采取这种插入排序式的那种方式,每删掉一个把后面的元素都移过来。但是这样的话,每删掉一个元素都要有ON的时间复杂度,我们看看有没有简单的办法。因为我们这个数组是当做一个列表。

或者说当做一个无序的集合来用的。所以它里面元素的顺序,我们并不关心,我们不需要保证它是由小到大还是由大到小,它是乱序,对我们来讲没有任何影响。反正所有没有检查人的编号都存在这个数组里了。

那么我们不保证顺序的时候,如果删掉AI其实有一个简单的方法,我们就把N这个表示数组的长度,我们就把N减一那个元素拉过来。😊,这样的话,AI这个元素就没了,并且数组长度缩短了一。

那最后一个元素放到了第I个位置。所以这么简单的一个操作就把AI删掉了。当然这样显然保证不了顺序,因为这个把最后一个元素拉过来的话,顺序就变了。但是我们只实现删除AI这个操作的话,这样就可以了。

那我们看一下这个怎么实现上面说的这个ON的算法。😊。

大概是这个样子。AI等于I当然我下标是就是编号从零开始0到N减1嘛。然后如果N大于就是剩余的多于一个人的话,我们就看一下。看一下A0和A1,因为它多于一个人,A0A1都是有意义的那如果A0认识A1的话。

刚才说了,把A0删掉,A0删掉就这么删。否则的话呢,A0不认识A1的话,就把A一删掉,就这么删。这样每次循环一次的话,N减小一。最后N变成一的时候,数组里其实只有A0了。我们再检查一下A0。😊。

是不是真正的名人,所以再循环一下,是的话就是A0。不是的话,我随便返回了一个-1。所以呢这个算法很简单,时间复杂度ON空间复杂度也是ON。因为这有一个数组大小为N的数组存在,所以空间复杂度在这摆着了。

😊,那这个循环每次N减小一嘛,所以这是ON的,下面也是ON的。那么我们再看一下。

有没有别的办法再优化一下,刚才那个虽然时间达到了ON空间它也要有ON了。我们看一下能不能把空间优化成常数空间呢,也就是所谓的O一空间呢。我们看一下。我们不用数组来做,还用那些数。我们维护一个什么东西呢?

从一头扫,就是IJ一块扫,怎么扫呢?我们保证I小于JI始终小于J,并且呢0到I减1是没有名人的I到J减1。也没有名人。那么我们看一下这个I和J之间的关系。这个先维护I等于0,这等于一,这是初值。

如果呢I认识J的话,那么I显然不是名人。我们把I等于JJ等于J加1。如果I不认识J的话,那么J显然不是名人,我们直接把J等于J加一。所以I和J始终是可能是名人的这两个人。然后我们根据判断。

是决定一下把I扔掉还是把J扔掉。如果把I扔掉的话,J保留,那么I就变成了旧的J。J呢自己加一就可以了。否则的话,I不扔掉,I还是原来的IJ自己加一就行了。这个算法写出来也非常简单。就是这样。

如果I认识JI等于J,因为我们要保证I小于J,注意这等于J加一就在这里写了。因为无论如何这两种情况都是这自身增一,所以我就写在循环上了。这个显然也是一个ON的算法。当然最后因为超出循环的时候。

J是大于等于N的,所以最后我们只能看一下I是不是名人就可以了。因为最后剩的一个人就是I。😊,这个是。第二种实现还是刚才那个算法,只是实现的方式不一样。我们把空间优化到了常数,我们看一下还有没有别的办法。

还有两头扫的办法,怎么扫呢?其实跟刚才说的一样。😊,I是0,这是N减1。我们同样保证I小于J,保证呢I之前没有名人,J之后没有名人。那么I和J是可能是名人的这两个人,我们还是这样,I认识J的话。

删掉I删掉I的话,我把I加一就可以了。相当于左边一个区间没有名人,右边一个区间没有名人,两个指针往中间靠I不认识这这的话,我们把J减一就可以了。所以这个算法实现出来是这样的。这个显然也是一个ON的算法。

因为I和J。要么它加一,要么它减一,总共循环了N次,当然最后还是要检查一下这个剩余的那个东西是不是名人。因为这个最后剩余的时候是I等于J的时候剩余的。所以我们看一下I就可以。当然看J也是可以的。

我们用另外一个变量做了循环变量。所以这是一个非常简单的题目,我们从ON时间的算法出发,做出来1个ON空间的算法,进而优化成了常数空间,所以只要思考一下,还是有办法做优化的。我们再来看第二个例题。

这个是li code上第42题。😊。

他说的什么意思呢?给你一个数组,这个数组里面表示的是这个数轴上每一块的高度,这个块就指的是黑的。比方说这个图对应的是零,这没有东西,一这个黑块高度是一,然后又是0,然后二这个黑块高度是2,然后又是一。

😊,零就继续看下去,这是一,这是三,这是二,这是一这是二,这是一。然后呢,我现在下雨,下雨之后,显然这左边没有东西,这积不了水,这左边这个外这不能算左东西,是空的。所有有块的地方都能积水。

这种蓝的就是水,问你一下,我最后能积多少水。那这个问题的关键其实是说,每一块儿。我指的一块是数值的这么一块,就是每一块这个呃长度唯一的线段,它能积水的高度其实等于。

它左边的最大值和右边的最大值里面较小的什么意思呢?这个零记不了。这个一它是积在左边的最大值,包括本身是一。然后右边的最大值无论是多少,当然这个右边显然是个三嘛,但是和一本身取最小。

所以这块连水算上最多也就能记一。那么这块呢,它左边的最大值是一,右边最大值是3,反正无论是多少比一小,所以它最多能记一,这块也一样记不了。这块呢。😊,左边最大值是2,右边最大值我指的左右是所有的。

右边所有最大值还是3,所以取小了。所以这块算上块儿在水的高度一共是2,这块一样,左边到2右边到3,所以还是2。所以这个问题就变成了求每一块左边的最大值以及右边的最大值里面较小的值这么一个问题了。😊。

那这个问题其实我在讲数组的时候,讲到前缀和的时候,其实它本身不是前缀和了,它是前缀的最大值以及后缀的最大值。这种东西我们显然能够在ON的时间内得到。😊,我们看一下。

我这样得了left就表示左边right就表示右边。那leftI就表示从零到I的时候,最大值是多少。那么显然最大值要么是I减1,要么是AI这两个取一个较大的。当然I等于零的时候没有I减1,所以有一个。😊。

特殊的判断I等于零的时候,left安减一是没有E的,右边也一样,要么是rightI加一,要么是AI,这个实际上就是所谓的前缀的最大值,这个呢就是所谓的后缀的最大值。那么刚才我说了。

对于第I块能积的水是它前缀的最大值和后缀的最大值里面较小的。😊,所以这个是连水在是这个AI本身的那个高度。那如果我们只算水的话,再把AI减去。这个显然这两个东西显然都是大于等于AI的。

因为我们这个left的I至少要等于AIrightI也至少要等于AI,所以这个不会减出负值来。那么最后我们把这个东西返回去就行了。所以这个问题也是比较简单的。显然它的时间复杂度也是ON的。

就是三个N的循环嘛,所以它也是ON的。😊,我们再来看。这个问题比较有意思。lead code上第十一题,它是说跟刚才那个问题意思差不多。他是说。😊,给你一个数组,AI呢表示。

X等于I就是数轴上X等于I那个点有一条竖直向上的长度为AI的线段。然后呢,两条线段之间再算上X轴,把X轴作为底部的话,两条线段之间就形成了一个U型的东西。问你这个U型的容器。能成多少水。

或者说哪两条线段之间的容积最大,什么意思呢?它的本质就是求AIAJ当然假设J大于I就是呃左边是AI,右边是AJ它能积多少水呢?它积水的高度显然是AI和AJ里面取最小的。那么它的底有多少呢?

底就是J减I嘛,就是X轴上的长度,这两个一乘就是它的面积也就是它能积的水的。😊,多少?那么我们实际上是想要求这么大一个东西,我先给算法再给一个简单的证明。😊,这三反非常简单,还是用所谓的两头扫的策略。

😊,I,从第一个开始,或者说从第零个开始,J呢从N减一开始。那么best就表示我目前得到的最大的容积。那我要保证I小于J,这个是维护条件,或者说可以把它理解为一个well whileI小于J。

我就要继续做做什么呢?做就做这个东西。这个东西其实就是这个式子。AIAJ取最小乘以J减I。那关键是这个如何更新。如果AI小于AJ就把I加移,否则就把J减1。实际上这也是一个两头扫,要么I加一。

要么J减一,它移动的实际上就是较小的那那边AI小的话,就把I加一,就是相当于把左指针往右移1个AJ小的话,就是J减一,相当于把右指针往左移移个。😊,我们来看一下这个算法很简单,为什么是对的。😊,啊。

先看一下它的实现。这个就是实现其实没什么好说的了。I等于0J等于N减1。然后I只要I比这小就不断的求这个东西。这个就是刚才的AIAJ然后乘以J减I,然后较小的那边往前移动一下,要么加加,要么减解这。

最后把它返回去。😊,为什么是对的呢?注意要证明呢,实际上是算法一定扫过最优解。我把这个扫标红了,什么意思呢?这个算法显然没有枚举所有的I和J,因为所有的I和G有N方个,或者说CN2个嘛。

就是2分之N乘N减1个嘛,但是它只枚举了N个。😊,呃,关键是我们每举这个N个一定包含一个最优解就可以了。我没有必要把所有都枚举了。那我们看一下。有一个关键点就是如果有一边,假设自由解是一个I一个J。

我们有一个关键点是,如果有一边已经移动到了自由解那儿,那么另外一边显然还没到,我们的意思是有一边先移动到了自由解那边,那么另一边还没到自由解,那么没到自由解的那个高度,一定比自优解。

里面较低的那条边还要低,什么意思呢?我们可以想象一下,假设较低的那边先到了最优解。😊,那么我们较高的那边还没到。如果较高的那边。目前比较低的那边还高的话,那么它们两个曲面显然是较低的那边,再乘以底。

因为它还没有到自由解,它的底在X轴上的宽度更宽了。那这个明显比自由解优,因为我们短的那条边没有变,底边更长了,那它容积显然更大了。那这个是矛盾的。😊,那么反之假设。长的那条边先到了最由解。

那么短的那条边,假设目前比。自由解的短的那边高,其实还是一样。这两个曲面的话还是比自由解短的那边高。那乘以它的X轴上宽度容积还是更大了。所以无论哪一边线到自由解,我们都能证明。😊。

其余那边的高度比自由解里面较低的边低。那这有什么意义呢?这这个意义就是说。它比较低的边低,它显然比那个已经到了最优解那条边低。那么它比那边低的话,按照我们的算法那边低就移动那边。

所以最优解那边就固定住不动了。另外那边因为一直在比它低,就不断的移移动到最优解为止。所以比方说我们假设I先到了最优解。根据我们这个关键点,J一定比I要低。并且一直比I低。

那么我们就不断的把J朝着I这边移动,最后会移动到最优解,所以这个跟to sum的证明差不多,凡是这种两头扫的证明,我们都可以假设有一边先到了最优解。然后另外那边。😊,还没有到最优解,没有到最优解的话。

根据我们的算法,一定是到了最优解那边不动,没到最优解那边不断的朝着最优解的方向移动,最后肯定会扫过最优解。这个就是一个简单的证明,大家仔细思考一下,为什么这个结论是对的,这个是关键。

主要是X轴上的宽度更更宽,如果再比自由解高的话,那么自优解就不是最优解了。所以这个是一个证明,大家仔细思考。😊,我们再看下一个例题。这个也比较有意思,叫做最大间隔问题。什么意思呢?给定一个数组A求。

下标对儿I和J满足AI小于等于AJ,并且J减I最大。当然J减I肯定大于等于0,因为这可以等于I嘛,等于等于零肯定没有问题。所以J减I一定大于等于0。😊,那我们看一下。我们假设目前自由解是D。

这个自由解指的是J减I,就是它们两个之间的最大的差值已经是D了。那我们对于这来讲。我们至少要看一下这个I等于J减D减一才可能更优。因为我们要让J减I最大,我没有必要看,就是比这个间隔还小了。

就是I大于J减D减1,这种I我们都没必要看。因为即使满足AI小于等于AJ。那么J减I也没有现在这个D那么大,我们的目标看一下能不能让这个J减I大于D才对。所以我们至少要检查J减D减1。

那这样就提示我们要不断的缩小I对于一个J来讲,我们要缩小I,我们看一下怎么缩小。😊,我们记录一下前缀的最小值,这个和刚才讲积水的那个问题是一样的。PX。表示。0到X之间的最小值。

那么我们看一下倒着循环J,对于J,我们看一下AJ是不是小于等于PJ减D减1,相当于用P做个引导。什么叫用P做个引导呢?因为我们不知道I再继续减小,还能不能满足这个条件。但是我们用这个就能看出来。

如果这个东西因为这个东西是反映了它前面的最小值。如果这个东西比AJ小证明还有前途,因为再往前移,我们肯定能移到一个比AJ小的。因为这个东西是前面的最小值。

相当于我在这个点我已经知道它前面有没有比AJ小的了。所以这个PJ就起到了这么一个作用。这个东西告诉我们那个I之前还有没有比AJ小的。如果有我们就继续移动。如果没有的话,当前的J减A就是一组可能的解。

那如果就像我刚才说的,如果这个东西大于AJ的话,就是说明前面所有东西都比AJ大,那这种I对这个J来讲,再往前的那些I就没有意义了。因为不可能有这满足这种条件的。因为它存的是最小值。

也就是如果最小的都比AJ大的话,那么I之前的那些东西都比AJ大。那这个J我们就无法得到更优的解,看一下代码还是非常简单的。😊。

这个PI就是我刚才说的那个PX的那个定义,且X项的最小值。😊,我们看一下白色的先等于0。J倒着循环注意这要大于best。因为我们我们要看的是J减best减1。这个best就刚才那个D要看的是J减D减1。

如果。AJ比这个东西。大于等于这个东西的话,那么我相当于那个I还可以更小I更小的意思就是best可以更大。那如果这个AJ比它都小了,说明之前的全都比它小。那么这个J得不到最优值,我们换一个J继续看。

那这个算法为什么是ON的呢?看它有两个循环,显然是ON的,为什么?因为就像我刚才说的内层循环并不减一直在增大这个best始终在增大,这个J始终在减小,并且我们循环条件是J大于best。

所以best和J一共循环了N次,所以不能光看循环的个数还要看他们一共循环了多少次,这个才是算法复杂度的本质,不能光属循环的个数,那最后bs就是解,请大家仔细理解这个前缀最小值的含义。

因为这个东西指导了我们还能不能增大这个间隙。如果不能增大了,我们就换J如果能增大,我们就一直增大。所以这个东西是很有意义的一个东西,它反映了前面的最小值。😊。

我们再来看第五个问题。给定一个01串。求它的一个最长的子串,满足这个子串中零和一的个数相等。什么意思呢?就是从零一串里面截出来一段,这段尽可能长。这段里面零和一的个数相等。那显然我们可以每举嘛。

我每举一个起点,每举一个终点,再数一下01的个数。那这样就是N3次方的这和最大指数组合很像,这个是N3次方的算法。那如果我们稍微优化一点,每举一个I,在每举G的时候,同时算一下零和一的差的话。

这是一个N方的算法,我们看一下ON的算法是怎么样的。😊,我们把零看成负一,把一就当做正一。还记得我们之前在数组那节课里面讲的这个前缀核嘛,其实这个就是一个前缀核。一个子串里面零和一的个数相等。

意味着什么?意味着这个子串里零的个数和一的个数的差,或者说把这个子串按这个规则,零看作负1一看作正一这么求和加起来的话,这个子串里面的和是0。那么和是零就证明了两个前缀和相等。

因为前缀和就是中间一段的和等于两个前缀和的差。比方说呃X到Y的和,其实等价于从零加到Y减去从零加到X减1,所以X到Y的和相当于这个。😊。

X到Y这个前呃0到Y这个前缀和以及0到X减1的这个前缀和的两个前缀和的这么一个差。所以前缀和是嗯总和是0,意味着两个前缀和相等。那么如果我们把前缀和都算出来,算前缀和很容易,遇到零就减一。

遇到一就加一嘛,把所有前缀和都算出来,我们排个序,对前缀和当然可以做排序,N logN等,因为有N个前缀和,排序之后相等的在一起。😊,我们求相等的最大间隔。就是比方说A1和A5相等。

那么5减1就有一个长长度为四的这么一个子串了。那么这个显然已经被我们优化成N和N了。我们看看能不能做到ON。其实我们不需要排序,为什么不需要排序呢?因为前缀和的范围是负N到正N,这里面数很特殊。

每个数要么是正一,要么是负一嘛,全是负一的话就是负N,全是正一的话就是正N,所以前缀核的范围是这个这个范围很好,我们把它加上N之后。😊,就变成00到2N了,为什么要加上N呢?因为我们不想让它出现负数。

那变成0到2N了的话,我们只要记录这个前缀和第一次出现的位置就可以了。因为我们无非就是要找两个相等的前缀和的这个间隙,两个相等的前缀和只有第一次出现和最后一次出现有意义。因为只有这两次出现的这个差值。

或者说这个长度才最长间隙才最大,所以我们只要记录第一次出现的位置就可以了。😊,那么我们怎么记录这个东西第一次出现的位置呢?显然我们直接用一个数组记就好了。-一表示没出现,0到N减一表示出现了。

这样就可以了。所以我们实际上是用一个数组记录这些东西出现的位置。我们来看一下代码。😊。

首先求一下长度,这个就是N乘以2加1,因为是0到2N嘛,所以数组要长一点,N乘以2加1,因为下标已经到2N了,之为-一-一表示没出现。然后这个前缀和是0,因为我们都加上N,所以我们这里面写N。

其实这个就是0s呢其实也是0,我们弄成N。这个因为都加上N了,这个表示零出现的位置,长度为零的出现位置。因为前缀和要加一个嘛,长度为零的出现位置在零出现。那么这best就表示我们最后的结果,最后的长度。

关键在这儿,这就是我们在算前缀和,遇到零减一遇到一加一,这个其实就是前A项的和。当然我们已经偏移了N了,所以零就是N嘛,所以这时候已经不用再加N了。我们看一下它出现没出现,大于等于零表示出现过。😊。

大于等于零的时候,我们就求一下这个相当于这次出现和第一次出现的间隙。当然我们需要记一下最后一次在哪出现,但是我们可以就是用这个的话就不用记,因为每出现一次我们都算一次。😊。

这里面只记录第一次出现的次数和位置。那么这个差值注意这个差值是I加一减have some,因为这边是0,我这个出现的位置是I加一,并不是I,所以这个是可能的子串长度。

因为相当于这个第I位呃第I加一位的和第have some位的这两个强缀还相等。那么它们的长度或者说间隙就是这么大。那否则就是小于零的话表示没出现没出现,那显然这个就是第一次出现,我把它质上。

最后返回最长的就好了。那这个问题的本质,其实我们是用哈希代替了排序。之前为什么要排序?我们想把相同的前缀和放到一起,那现在我们没有排序,是因为我们记录了相同的前缀和第一次出现的位置。

所以我们用一个哈希代替了排序。而当这我标红的哈希的值比较小,并且是非负整数的时候,像本题是零到2N之间,它比较小,因为是N级别的,并且都是非负整数。那么我们可以直接用数组下标做哈希。

其实这个s就是一个哈希函数的东西,只不过我们直接把它放到数组下标里面来了,它的范围比较小,我没有必要对它进行变换。所以我们直接把数组当哈希使用了这个数组下标就是哈希函数的值,这个是我想讲的。

在某些特殊的情况下,我们可以用数组当做哈希达到降低时间复杂度的作用。😊。

我们来看最后一个例题。这个也是最近发现的一个面试题,什么意思呢?给定一个N乘以N的01方阵。因为这个N乘N嘛,显然它是方的,每一行都是降序的?什么叫零1方阵?每一个。元素要么是零,要么是一。

每一行都是降序的意思就是每一行里面先出现连续的一段一,再后面都是零,都是先一后零的。但是一有多少个不一定,但无论如何都是先一后零的。那么我们求。😊,一最多的那一行就是最多的那一行有多少个一。

就这么简单的一个问题。😊,关键是能不能ON做到,显然ON方式可以做到,我们直接每一行数一下嘛,便利整个方阵第一行数一下,第二行数一下,这显然是一个N乘N的时间复杂度。那。😊,因为它给了我们是先一后0。

那么这个显然是一个有序的东西,我们可以二分对每一行二分二分出零和一之间的界限。那分出这个界限,我们就知道每一行有多少个一,所以时间复杂度是Nlog N的。因为每一行二分的复杂度是logN行嘛。那这个呢。

😊,就利用到这个序了,但是它还是数出来每一行有多少个一。其实我们没有必要数出每一行有多少个一。就像刚才算那个容器的最大的容积一样,我们没有必要每举搜有的容器。

我们只要保证最优解能覆盖到这个我们搜的那个解能覆盖到最优解就可以了。我们来看一下。假设我们在某一行某一列的位置,如果它是一,就说明我们至少有这么多个一了。因为一都是连续的嘛。比方说第一行第五列是个一。

那么我已经知道第一行至少有5个一了。那下面那行有4个一也好,有三个一也好,我根本就不关心。我只要看后面那行可不可能大于5个一就可以了。那么如果是一的话,我就继续向右找到第一个零,这样的话。

这一行有多少个一,我就知道了。那如果是零的话,我就向下,因为是零的话,我知道上一行到此为止,上一行或者说这一行只能有这么多个一,比方说有5个一,第六个是零,那么我们向下看一下这个下面一行第六个是不是一。

如果下面一行第六个是一,我就知道下面一行至少有6个一,它已经比上一行优了。如果下面一个还是零的话,那么我们继续往下。所以。😊,我没有必要数这一行究竟有多少个一,我们只要知道最多的那一行有多少个一之后。

目前为止最多的那一行有多少个一之后,我们往下走往下走。如果还是一的话,我们继续往右。因为因为一都是连续的嘛,我们往下走,如果还是一的话,说明这一行的一的个数比我目前知道的最多的还多。那么显然要往右走。

看看能不能更多一点。如果是零的话,说明我这一行的一的个数显然没有我目前知道的最多的那一行的一的多,所以我也没有必要往左看它有多少个一,所以这个有点像杨氏矩阵的查找。

我如果发现零就知道目前为止最长的那一行有多少个一了。我就从这一列往下找。😊,直到找到一再往右就可以了。如果都是零的话,显然就没有必要往左走了。因因为那些是零的。

肯定没有之前我们得到的最由解的一的个数更多。我们来看一下这个算法,非常简单。

best就是说我目前。知道最多有多少个一了。那么B的小于N,因为最多也就N个一嘛,B小于N,并且I小于NI就是行。我们看一下。如果AIb的还是一的话,我们就bis可以加一,只要发现一。

这个相当于不断的往右走嘛。如果发现不了一了,说明我最多只有这么多个一了,我就往下挨加加了,我就往下看一下。再往下边那一行,是不是能找到更多的一,如果找不到,就继续往下走。所以这是一个非常简单的算法。

这个算法为什么是ON的?还是刚才那个道理,best在不断的增增到N就截止了I也是,所以最多也就循环2N次。尽管它有两个循环。所以这个时间复杂度是ON的,请大家仔细体会这个算法。😊。

那做一下总结,其实ON时间可以解决很多问题,我都没有时间没有讲出来。当然还有很多问题我之前也提到过,比方说最大指数组合,这个在实战里提到过KMP我们有视频讲过这个这个最长回文子串的算法也是线性的。

也也有视频讲过这个呃最大直方图。这个我在单调堆列呃单调堆战那张里面讲过,就是呃对战进而是单调对战里面讲过。然后滑动窗口最大值这个在队列以及单调队列那里面讲过快排的partition这个之前讲过很多字。

它显然是个ON的,有很多变种。比方说把正数和负数分开啊,把这个零和一分开啊,把呃星号和其他字符分开啊,都是这个过程,包括这个荷兰国旗问题。

这个也是这个firs missing positive就是给定一个排列是不是找出它第一个缺失的整数,这个这两个问题,我在数组那一张应该都讲过杨氏矩阵查找。我在这个呃查找排序实战里面讲过排列组合相关的。

这个没有提,我下次会讲一下,就是返回下一个排列以及上一个排列的这个算法,它也是一个ON的,它是一个非常美观的算法,数相关。其实我在数那一张还有递归什么的地方都讲过,比方说二叉数的便利啊,最大最小深度啊。

同构判断镜像判断,以及是不是平衡数啊,包括是不是二叉搜索数啊,反正反正凡是涉及到数的。😊,基本上都是ON的,为什么呢?因为它是特殊的图。这个图有N个节点,N减一条边。

我们便利整个数的时间复杂度就是ON这个和便利图不一样。因为便利图的时间复杂度是N加M,就是节点数加边数。对于数来讲,它是特殊的图,它特特殊就特殊在它的节点和边数是同一个规模的,都是N的级别嘛。

一个N1个N减1嘛。所以便利这种图,它的边那么少的图,它的时间复杂度就是ON了。所以我之前要提ONN是什么?一定要仔细考虑,对于数来讲,节点和边是一样的。对于普通的一般的图来讲,节点和边是不一样的。

一般我们会认为这个边数是节点数的平方,这个是对于比较稠密的图。😊,那最后就是还想说要多思考,多做练习,多想问题。因为这个ON时间的算法经常在面试里面出现,需要有一定的感性和理性的认识。好。

今天的课就到这里,希望大家给我提出批评、指正,谢谢大家。😊。

人工智能—面试求职公开课(七月在线出品) - P10:图与树的面试题精讲 - 七月在线-julyedu - BV1Xf4y1r74s

大家好,欢迎观看7月算法公开课。我们这堂课的主要内容是图论面试题精讲。我将从如下几个方面讲述本课,先讲一下图论方面的简介。接着总结一下近些年来图论相关的面试题,做一个总体分析知识点的梳理。

接着我会讲五个例题,说是5个例题。这里面的例案其实是很多个小例题。因为他们都可以用一个统一的递规框架来解决,我就把它们放到一起了,希望能起到抛砖引玉的作用。从难度上讲呢,例一例二是比较简单的。

例三可以算中档题,例四是中上档。例五是最难的,所以难度基本上是递增的。最后我会总结结束本课。关于图论,其实大家比较熟悉,在数学领域,图结构是一种非常抽象的结构。我们要定义一个图呢,就要先定义它的节点。

再定义它的边。这两个东西定义好了,这个图就定义好了。它的分类呢其实分为有向图和无向图,这个主要取决于边是否有方向。那特殊的图在计算机的数据结构里面,特殊的图其实就是无相的。无环的图,也就是树。

这个数是指的无根数。那还有一种是有根数,这个写在这里了,并查集是一种有根数。这个在库斯co算法里面我讲到过。还有一种比较特殊的树,就是二叉树。其中更重要一点的就是二叉搜索数,这个都是比较经典的数据结构。

当然还有一种就是堆堆,其实也是一种科数的二叉树,比较著名的堆排序,就是用这种数据结构,这个是图论方面的简介。关于面试题,其实内容比较多。对于图来讲,我们会考察它的联通性。

就是两个点之间是否有路以及联通分量等等。啊,包括割点割边的概念。什么叫割点,什么叫割边呢?就是我把这个点去了,或者把这个边去了,这个图由连通变成不连通了。也就是我删掉哪个点,它就不连通了。

或者说删掉哪条边,它就不连通了。这样的点和边叫做割点和割边最好证成数,我在之前的课程中讲到过最短路很多类型,这个包括单元图的最短路。呃,任意两点间的有没有附圈的各方面的最短路。

我也提到过搜索BFSDFS讲到过欧拉回路与哈密尔朵回路。这个主要是概念上拓空排序比较简单。那对于数来讲呢,主要考察它的定义与判断这个定义有可能是普通的数,也有可能是二叉搜索数等等。

判断它是不是二叉搜索数,以及它平衡不平衡。求它的最大高度啊、最小高度啊,以及最近公共组先啊这类问题。这个是数和图方面的面试题的总体分析。我们接下来看正式的例题。第一个提示。

li code上105题比较简单,它给出的是二叉树的前序和中序的便历序列,要求我们构造这个二叉树。我们看一下前序遍历既然叫前序遍历。第一个节点显然是跟。那中序遍历呢,它的根在中间,但是我们有了这个根。

从前序里面,我们能看到这个根是X。我们从中序遍历里面也找到这个X,然后中序遍历就被X分割成两部分了,左边那部分就是左子树的中序遍历序列,右边那部分就是右子树的中序便历序列。那从前序遍历序练里面。

我们根据这个长度也把它分成两部分,这样我们分别就有了前序遍历序列的。左子树的前序变理序列以及右子数的前序变理序列,以及它们分别对应了中序变理序列,这样就分割成两个子问题了。

我们分别构造左子数和右子数就好了。我们来看一下代码。这个特殊情况单独处理。如果就是less是零就是空的,否则的话这个proor就是前序嘛,这个东西就是根了。根节点我们已经找到了。

那么分别找左右找左右的时候是从中序遍历里面找到这个根节点的位置,然后分成两部分,前序遍历也对应的分成两部分。这个下标的范围要算好了。这个要细致一点就可以了。其实大家可以看到它的本质也是一个递归的过程。

这个递归其实是前序遍历的过程。因为我们先遍历了,或者说先构造了根节点,然后再构造左子数再构造右子数是这么一个过程。有一个思考题就是lea code上106题,它是给定了后序遍历序列,以及中序遍历序列。

然后也构造这块二叉树,其实跟这个思路是完全一样的。第二个问题,其实它是一系列问题,主要是我总结了一个一般的思路。从刚才那个问题其实也能看出来。这个二叉树相关的问题基本上都可以用递归来实现。

倒不是说必须用递归。因为有的时候呃面试可能要求我们写非递归,但是它都可以用递归来实现。那递归就分为我先做哪部分,其实无外乎就是跟左右这三部分。那根据他们便利的顺序不同。

也就对应了一个抽象意义上的前序中序以及后序便利。比方说刚才那个问题,其实对应了一种抽象的前序便利。那我们看一下这个我现在举的这几个问题。第一个问题相对难一点。这个lea code上124题。

就是二叉树上每个节点有一个整数返回和最大的路径。什么叫和最大的路径呢?因为二叉树它说到底它是一棵树,任何两个点之间它都有一条唯一的路径,因为它是树嘛。那这条路径上每个节点都有一个整数。

这个整数的和就叫做这条路径的和。我们要求一条和最大的这样的一条路径。那么我们分别计算从左子数延伸下去的一条和最大的路径,从右子数延伸下去的一条河最大的路径。什么叫延伸下去,就是往叶子的方向延伸。

当然不一定到叶子,我只是要和最大。那么还有一种情况就是通过根节点的这个和最大的路径。那显然这个这个子数上的和最大路径,要么是我指的是一定要通过根节点,要么是从左子数从根到左子数往下延。

要么是从根往右子数往下延,要么就是一个V字形的到V字形的,呃,从左子数到根再到右子数这么一条,所以只有这三种情况。当然我们要求全局的最大值,所以这里要注意我返回值和最大值的关系。

可以看一下我的自己写的代码。注意这里面我写了一个帮助的函数叫help。我最后的返回值不是help返回值。help是有返回值的,但是我没有用help的返回值。这个result result是传引用进去的。

所以它会变对特殊情况单独考虑,我们处理一下左子数。左子数注意这个help返回的什么,help返回的就是从根节点往下延伸的最大的值。所以对于左子数来讲,就是从左子数的那个根节点往下延伸的最大值。

右子数也是一样。从右子数那个节点往下延伸的最大值。我们的目的在于如何用这两个值求出全局的最大值。我们看一下,先求从root往下延伸的最大值,也就是这个return节点。这个return的值,实际上就是。

😊,左子数和右子数较大了,加上根节点,因为我一定要从根节点往下延伸,所以至少取了根节点一个节点。这个呢这个和最大子数组合比较像。如果这两个值都是负的的话,我根本就没必要取我一个根节点就可以了。

我没有必要往下走。因为那两个值都是负的,所以这个return实际上最后求的是从这个root往下延伸的最大的那条路径。😊,那我们这个M是全局的最大路径。当然我这个root遍利了所有节点之后。

M就是全局的了。那么到目前为止,我这个M需要把这个当前这个节点经过当前这个节点的路径算出来最大的那条路径算出来。那显然这个return是一种可能。

这re就是从根往下走的那还有一种可能就是我刚才说的到V可能到V就是左子数的右子数的加上root的,其实它本质是个动态规划,因为左边我一定要最大,右边一定要最大,然后再算上根这三个和才可能最大。

所以M是所有东西的最大当root变利了所有节点之后,M就是全局的最大了,这个引用它会变。所以这个最后返回的全局的最大值。所以这个是。嗯,最大路径和位题?那我们看一下第二个问题。

第二个问题是返回二叉树的所最小深度,这个跟我们的深度定义不同。它这里面最小深度定义的是从根到叶子。一定要到一个叶子的。最少经过的这个节点数。那。我们要注意,比方说一个非常简单的二叉树,左子数是空。

右子数就一个节点,这个二叉树一共就两个节点。那么我们就要返回二,注意一定要到一个叶子。所以尽管它左子数是空,然后如果我们对左子数,右子数分别取最小的深度,那么我们会取左子数是零,右子数是一。

那么最后从根节点到零的距离最小,所以最后返回一个一,这是错的那思路还是左子数右子数最小深度取最小,但问题要保证左右子数都存在,这就是我写了这么多判断的原因。那如果左右子数都存在,根据我刚才说的。

它其实就是左右最小,然后当然加一个一。那如果只有一个的话,左子数存在,右子数不存在,那么就是左子数的那这个是对称的右子数存在,左子数不存在,就这样。否则的话左右都不存在,就一个根了,那就返回一。

那这个其实也是一个递归的过程,呃,可以把我个人理解可以把它理解为一个前序遍利吧。因为我们先访问了根,其实它。😊,不是一个很严格的前序遍历,但是它也是一个递归的过程。

刚才那个求路径和是一个很经典的后续变历。因为先算left,再算了right,再算了根,这个也是一个递归的框架。我们再继续看。判断树平衡平衡二叉树其实是这个数据结构里面也是一个比较重要的数据结构吧。

它的定义是我从每一个节点开始算出树的高度,注意这里面树的高度是最大的那个高度,而不是刚才定义的那个最小深度,就是传统意义上的树的高度。如果每个节点左子树和右子树的高度至多差一。那么这个二叉树是平衡的。

那这个数据结构书上也有所介绍。那看看我们来怎么判断给定一个root,就是以这个为根的二叉数是否是平衡的。我们我还写了一个help函数,这里面hat还是一个引用,它会变。那它返回的实际上是root的。

就是这个二叉数的真正意义上的高度。那么这个布尔函数最后返回的就是它是不是平衡的,我们顺便把它的高度算出来,因为平衡跟高度相关嘛,那等于零的时候单独处理,否则的话呢。我们看一下,算一下左子数的高度。

同时因为我们这个函数可以判断它是否平衡。如果左子数不平衡,显然整个二叉树也不可能平衡。因为二叉树的平衡要求,每一个节点的子数都要平衡,这个不平衡,那就不可能了。那直接返回了。那如果左子数平衡。

我们看一下右子数一样的那如果这两个都平衡的话,我们看一下以这个root为根的这个是不是平衡。那就要看一下这两个高度之间的关系。首先先算出这个root本身的高度。

这个高度刚才根据高度的定义是两个较高的加一,那么它是不是平衡呢,就看一下他们两个差是不是是不是至多差一,就是这个条件。那这个是在算平衡的时候,同时算出了高度。那其实这个我个人觉得也可以算一个便利。

但是不太好说什么便利。因为它先访问了根,我们可以理解为前序遍利。但是呢也可以理解为是后续遍利。因为假设这步不算的话,我们考虑的其实是先算了左再算了右,再把根节内的值算回来。

所以具体是抽象意义上的什么变力并不重要,本质还是一个递归的过程,递归基本上就是考虑左右以及它自身怎么算。所以这几个题的这个框架上来讲都是差不太多的我们再继续看。就最大深度,这个是我比较喜欢的一个题。

其实这个在那个刚才那个平衡上其实已经求出来了。我比较喜欢它的原因是其实如果写代码的话,一句话就可以写出来。当然这个用了很多技巧。比方说这种问号表达式,如果root是零的话,显然是一个空的数,高度是零。

否则的话,它就是左子数和右子数高度较大的加一,这个本身就是高度的定义,它写起来非常美观。一个二叉树的高度定义为左右较高的加一空数的高度定义为0。所以根据定义,我们直接就写出了这么一句话。😊。

这个很快了就可以过去,它是104题。那还有一个是判断两个二叉数是否相同,这是100题,这个也非常简单,给定两个二叉数,我们怎么判断它是否相同呢?假设它是P和Q,如果P是空,那么Q一定要是空。

所以我们看一下Q是不是空。如果到这里就说明P不是空了,Q是空,那显然是for。这两个 if服特殊条件处理完PQ都不是空,PQ都不是空就好办了。我们看一下他们的value是不是相等。

然后看一下它们左子数是不是一样的,右子数是不是一样的。所以本质还是根节点长的什么样,左子数是不是一样的,右子数什么样。根据定义其实两个数是不是一样,都是空是一样,空和非空不一样。

其实这个就是这个本身的定义,那一般情况下就是两个节点是一样的,并且左子数和右子数都是一样的。这两个二叉数就是一样的。所以。😊,这个二叉树由于定义本身是递归的,我们写代码都可以写成递归的,而且非常简单。

非常方便。你们继续。判断二叉数是否对称,这个是li code上101题。我们看一下,首先要对称,我就判断一下它的左子数和右子数的关系。那么重点就在这儿,左子数右子数空和非空。这个和刚才PQ那个是一样的。

否则我就看一下他们这两个Y6一样不一样。但是是判断的时候是这个左和这个右判断这个右和这个左判断。其实这和那个is same train非常像,只是这个左右颠倒一下,就是判断对称了。那,再继续。

判断是不是二叉搜索数,这是立得课上98题。呃,说一下这个题其实做法很多。因为这个我们可以判断呃是不是左子数的最大值,还要小于根节点,并且右子数的这个最小值,还要大于根节点等等,有各种判断方法。

而且我们还要考虑第一个节点啊等等这些特殊的这些地方。但是呢我我采取的判断方法是,如果一个二叉数是二叉搜索数的话,我们对它中序遍历,便历完的那个序列一定是有序的。

这样我们就不用考虑什么左子数最大值、右子数最小值这些具体的问题了。我们就做一个中序遍历,然后做完之后看一下那个序列是不是有序的。但是呢我没有存下来它的中序便历序列。😊。

我只是看一下当前的这个值是不是比前一个值更大就好了。因为这个序列我没有必要把它存下来。当然存下来是一种方式,我们可以用一个vector或者list了之类的东西,把中序遍历的序列存下来,再循环一遍看一下。

但是我没有必要,我们按顺序遍历直接跟前一个比一下就可以了。所以我这里面last就是。我前一个节点变利的值。当然在这里面是value,这个值是个引用,它会变,它的初值其实没有关系。

关键是我还有一个firstfirs表示我现在有没有变利过值。如果当前是就是这个节点是第一个遍利的节点,就是firs一上来是tro,就是这里的mark。当然它也是个引用。如果它是 true的话。

说明当前这个节点是第一个便利的节点,它就不要和之前的便利了。当然我们可以用一个类似于哨兵的技术,把这个之前那个节点设置为负无穷,就不需要这个了。但是对in来讲,我不太习惯设置这种max。

就是负max或者这种东西。所以我用了一个布尔的变量。所以一上来把它制成tro,表示现在还没有变利过任何节点。那我们看一下这些东西怎么更新。首先空数是二叉搜索,这个没问题。那么我刚才说了。

需要做这个中续便利。中序变力就要先遍利左子数。我看一下左子数,是不是左子数是二叉所索数了。那么我现在要辨历根节点这个位置,根节点,我要看一下左子数是不是真的便利了。也就是说左子数有可能是空。

它可能一个节点都没有。那如果左子数。就是说没有节点的话,这forrs就会是true。那么我当前这个root这个节点就是我便利的第一个节点,所以我这last就有值了。

我这last永远存的是上一个节点是什么东西,同时把forrs复成force。这个实际上就是中序便利里面更改状态的那一步。那我们再看一下。如果不是呢,就说明first的是for呃是for。

是forrs的话,就说明这个左子数确实变利了一些节点。那就证明我这个last的是有意义的。那么我就看一下我这个root的value和last的关系。如果last的大于等于root的 value。

那它显然不是二叉所所数。因为我刚才说了,它需要有序的,中序变列是有序的。我这root的value一定要比上一个值大,那这个就反了,所以就这样了。那么。这时候我在这个return force。

那如果值是正着的呢,那么我上一个值就变成了root value,这个永远是我最近一次遍历那个值。目前我变历完root value了,再变离柚子数就可以了,注意把last的传过去。

所以它的本质还是一个可以理解为一个中序变历,它本身就是一个中序变历,只不过我改变了一些状态,主要是处理存上一个遍利的值,主要是这个意思。所以这个也是一个不算太难的问题,例得课堂上98题。我们再继续。

这个是第三个例题,就是二叉树与链表之间的转换。这个是我比较喜欢的一个题。在讲链表的时候想把它加进来,但是由于时间关系就不得不把它删掉了,所以在这里面讲一下,因为它也是和数相关的。这个是二叉树转链表。

具体转的方式其实很简单,就是我把左子数。转成链表,转成一条单链,转成单链之后,把它接到右子树上,也就是最后所有的链都在右子树上,左子树是空,然后。右子数先跟的是左子数转成的链,再接上右子树自身转成的链。

所以它是这个一个很长的链,先是左子树转成的链,接到右子数,然后再是右子树本身转成链,再接到下面是这么一个链。那根据它的转的定义,其实具体要看一下lea code上114题。

它到底是怎么转成列表的这个要求可能不一样。这个问题本身它定义的,就是我刚才说的那种定义。那看一下空就不说了。同样我需要记录一下这个最后一个节点。因为我转完之后,那个右子数转完之后。

我要接到这个左子数转完的那条料的后面。所以我总要因为链表相接,总要考虑最后一个节点,所以我要记录一下最后一个节点,这里我叫my last,当然这个last是真正意义上最后一个节点。

这个my last的是个局部值。那么我看一下,如果不是不是空的话,就把last的更新一下,然后按照我说的方式接,注意把root的 right变成了root的 leftft。

因为这个时候我是先转的left,这时候left已经是一个链表了,所以left已经是一个朝右链的这么一个链了。那么我把它附到right上,附到right上之后呢。

那root原来的right在这个tample里面记录了,所以这是我之前也强调的,我要更新一个值,要注意把前面的那个值保存掉,不然你就找不到了。这个目前这个tample是真正意义上的柚子数。

而root这个右子数实际上是左子树转换出来那个链儿,左子数浮空了。那么实际上last right其实就是那个temple。因为我要把这个呃最后一个节点接到接上那个真正意义上柚子树。

那我们再转直接转这个tpo就可以了。下面无论last是不是空,我都可以直接转tamppo,转tle更新一下last,实际上它也是一个这个可以叫做。可以叫做中序便历的过程吧。因为这个是先先弄的左子数。

再访问的根节点,再便离一下右子数。这个tample实际上是变离右子数,所以不要严格的区分它是一个前中后哪个遍历。它我们就要考虑一下左子数怎么处理,根节点怎么处理,以及右子数怎么处理就好了。

所以这个又一次印证了这个刚才例二的那个基本框架,它就是一个递归的框架。你再看一下链表转二叉树。当然这里面要二叉树尽量平衡。那一个直接的思路就是我先求一下这个链表的长度。然后我每次的虽然我知道链表的长度。

但是我这个链表长度是在外面求的。虽然我知道链表的长度,但是我每次还是要走到那个位置,把那个根拉出来,分别把左右弄一下,知道左边多长,右边多长。那看一下这个算法的复杂度,其实是N logN的,为什么呢?

因为。我虽然知道我想要哪个节点,但是我从列表是从头走不到那个节点,我需要走到那个节点,把那个根拉出来,然后左右单独处理。那这有1个ON的这么一个循环,这个跟那个啊快排啊,mod sort都比较像,就是。

TN等于T2分之N加ON,因为它的递归,这个或者说分制合并的部分有一个ON的部分,所以它是ONlogN的。本质原因呢是因为列表不能随机访问。其实我知道我要哪个节点,但我拿不到,这是lea的上109题。

这个其实它和数组不一样的地方是还有一个问题是数组转成平方差数,那个用数组就能直接做到ON因为呃它不需要这个。就它不需要这个呃直直接循环访问,它可以直接通过下标访问到这个根节点。

那我们看一下它有没有ON的方式呢?其实是有的,我们可以优化来看一下。其实这个长度也是在外面算出来了,这个ON不影响,关键在里边我没有没有一个循环。那这个是什么意思呢?注意我这里面原来的那个是非引用。

现在是一个引用,就是说这个东西会变。我这个head是说我给定了一个这么一个列表,它的长度是Lance,我现在要把它变成二叉树,变成二叉树之后,我指向的是Lance之后的那个节点。

也就是我ha的随着变的时候,我自己也在变。我们看一下怎么变,先处理这个左子数。因为左子数就是我知道它总体长度,那么我知道左边要取name这么多个节点,那么我就取那么多个节点。根据这个hap的定义。

我取name节点之后,这个新的ha就变成了name个节点之后的那个头了。所以我这个函数执行完之后,这个ha已经往前走了那步。那么我这个root就是当前这个节点。因为我已经确定好根节点的位置了。

左子数有多少个已经确定好,那么右子数有多少个,右子数就是lesss减name减一个。因为那个在左子数一个在根节点。那我这个关键是这个ha等于ha next把这个节点跳过去,看起来这边只跳了一个节点。

实际上根据这个函数本身递归的定义,实际上这个left回来之后,这个head就变成了我想要的那个根节点的位置位置。所以它没有省掉了那个循环,这个代码看起来是差不太多的。

它的本质也是啊先算一下左子数处理一下根节点再算一下右子数,都是这个思路,它。😊,变那这样的时间复杂度就是ON,因为PN等于2倍的T2分之N加O1,现在没有那个循环了嘛,它就是ON了。那有一个思考题。

其实比这个简单,就是我刚才说的数组转平衡差数,它是立的 code上第108题,它其实就呃可以用第一个思路嘛,它直接就把那个关节点拉过来,就没有这么复杂了。我们看一下例四例四是说一个无像图的复制。

这个题是li code上133题,它是一个中等偏难的问题。当是li code上给它规定的是medium,就是中等题。那它无像图其实存的是一个连接表,就是每个节点存了它的邻居。

但是注意这个呃无像图它可能有圈儿,就是自身到自身可能有这样的边。如果我们不把它存好之后,它就会反复复制,这个有点像呃复制随机指向的列表,在列表那一张有一个random指针的那个东西。

其实这个思路跟那个思路差不太多。但是那个是通过一些技巧避免了使用map。我这里面简单的使用map。因为这个。无像图的节点,它自己有个label,就是说有个整数值。

我这个map就表示把key就把这个label映射成了具体的节点的地址。那我通过DFS复制就可以了,怎么复制呢?它的输入是一个节点,我从这个节点开始复制,那我就复制把这个have传过去。

这have就是那个map,注意也是引用会变的。所以时刻注意我这个传的东西到底是个什么东西。要是传引用的话,其实和传全局变量是一样的。那么我们看一下,先从这个。map里面找一下这个label。

就是说这个节点我复制过没有?如果复制过,我直接返回就可以了,这个可以理解为一个缓存或者一个呃什么东西吧,就是基本上可以理解为一个cash。如果没复制过,那我显然要复制。

那么我就复制一个label的这个东西。注意这里面虽然它还它的邻居还没有复制好,但是我已经复制一个这样的节点了,我一定要把这个节点先放进map里面,为什么?因为我后面在复制的时候,还有可能复制它本身。

复制它本身的时候,你递归的时候会发现它不在map里面,那那样就会出问题。所以这里面尽管我这个。😊,node还没有完全复制好,它的那个邻居还没有复制,但是我可以先把它放到map里面来。

注意这里面map的value是个地址,所以没有关系,尽管那个node本身的邻居那些列表都会变,但是这个 nodeode地址只要我有了这个node,它的地址就是一个死的东西。所以我把它放到map里来。

没有问题。后面就是简单DFS过程,把它邻居一个一个复制就好了。并且这个这个东西是个vector,这个neighbors是个vector把它邻居一个复制。还是我刚才说的这个new note的地址不会变。

它自己变没有关系,这map里面的valueue是不会变的。关键问题是图可能有圈儿。这个是第四题,你再看一下最后一个问题,这个题比较难。给定一个矩形棋盘呃,比方说这个例子再指定一些位置。

比方说画这个阴影或者说画黑的这些例子呃,ABCDEFGH我规定了这么8个点,我要一定要经过这么8个点,并且呢起点你可以自己定,你定哪都行。我规定一个,比方说从A,这个是你自由选取的。然后呢。

每一次走的方向要么水平走走多少格没有关系,要么竖值走。但是每一次只能和上一次走的不同方向,什么意思呢?我上一次水平走了,这一次就要竖直走。如果上一次是竖直走的,这一次就水平走,然后每个位置只能经过一次。

就是这这8个节点只能经过一次问是否是可能的那比方说这个例子,这个A,我走到D。这是水平走的,再走到E,这是竖直走的,再走到F,这又水平走的,再走到C,这又竖直走的,再走到B,又水平走的。

再走到G又竖直走的,再走到H又水平走的这是可能的。我每个界点只经过了一次。😊,那。如果按我们传统的定义,就是直接把它定义出来的话,这是一个哈米尔顿路的问题。什么是哈米尔顿路呢?就是给你一个图。

每个节点只经过一次,把这个图画出来。当然不不一定要求画出每条边,就是你能不能沿着图的边,每个点只走一次。把这个顺序走出来,看似是个很简单的问题,但是实际上它是NP hard的。所以。

如果转成哈密尔顿路基本上就不太可解了。我们看一下有没有更好的办法。其实呢我们把所有节点的X坐标放到一起,Y坐标放到一起。那么我每走一步就相当于从X跳到了Y,然后再从Y跳到了X。

因为它每一步要么就是水平的,要么就是数值的。所以就相当于在X和Y这个两个集合之间来回跳。那问题对应于能不能跳出这个能不能走边这个图的所有的边,这是一个欧拉回路的判断问题。哦,欧拉路的判断问题,不是回路。

我们来看一下。这个其实就是我们转化出来的。我们注意A是00,那么A在这儿,然后B呢,B是02。那这是B那个点C呢C是0406,所以看一下。然后E大家看一下0122。26吧。26,所以有1个2到6的边。

所以这个每一个节点的行放到这边,列放到这边,然后能不能走,就取决于我能不能一笔把这些把这些东西画出来,主要是指的边。所以这个就变成了一个欧拉路的问题。什么叫欧拉路?就是我画出一个图,每条边只能画一次。

但是节点可以反复画,就这样走,我可以反复走节点,其实就是著名的一笔画问题。我把这个问题转化成这样的话,就变成了一个一笔画问题。虽然它看起来跟哈密尔顿回路或者说哈密尔顿路问题很像哈密尔顿路问题。

再强调一遍,是说我画一个图的这个。啊,不是画一个图,我要经过一个图的所有节点,通过边经过一个图的所有节点,每个节点只经过一次,问是否可能啊,这个欧拉路是什么意思呢?是我要画一个图的所有的边。

就是这些边我必须都经过每条边只能经过一次,但是节点可以随便走。问是否可能欧拉路和哈密尔顿路看起来很像,但是欧拉路是个简单的问题,它有多样式时间的算法,通过DF就可以搞得定。

并且呢我们这个问题不用真的求一条欧拉路,而是判断它是否可行,也就是它有没有欧拉路就可以了。所以有没有欧拉路其实在数学里面一笔画问题有着著名的解法,我们统计一下每个点的度的奇偶性,判断一下就可以了。

所以这个是。从这个一个图论一个这个走格子的问题转化成一个欧拉路的图论问题了。那给大家留一个思考题,这个是密码密码锁问题,好像google面过这个问题,它是。给定一个密码锁,密码是是四位的数字。

那我们操作是什么意思呢?操作呃先不看这些文字叙叙述操作是如果现在是ABCD,我们可以把它变成BCDE怎么变的呢?它那个密码不是这个上下调的,它是左右换的,我把这个A扔掉,然后BCD往左移动一下。

然后这个低位出现了一个空格。那么我把这个空格上随便放一个数字放几都行。0到9都可以放了一个E。所以它的转换是把扔掉高位数字,就是把A扔了,把低位数字移动到高位,就是BCD整个移过来。A扔了之后。

这有一个空格,BCD移过来,然后再把低位上放上任意一个数字,所以这个是我们调整密码的过程。那么他就问了,我从任何一个状态开始,是不是可以经过000就是4个0到4个9,就是所有的组合经过一次且紧一次。

其实它原来问题问的是是是否可以这个就是最少多少次。可以经过所有状态,其实最少就是1万次。因为因为这个可以证明它是有欧拉路的那给大家一个提示怎么做?刚才说了,我们要定义一个图,就是定义它的节点和边。

那么节点是什么?我们这里面节点比较特殊,节点是三位数字,任何三位数字,也就是说有1000个节点从000到999。那边呢如果这个。节点的后两位和另外一个节点的前两位一样。

也就是ABC和BCD这个BC和这个BC是一样的,它们有一条边。那么这一条边实际上就相当于了ABCD。所以这个跟这个问题很像,这这一条边代表了一个状态,代表了1个ABCD那么我们再走一条边。

比方说BCDE就相当了就呃CDE就相当于从ABCD转化成BCDE的过程了。所以每个节点都走一次,相当于每条边都走一次。其实这种图叫line graph,就是线图可以证明它是有欧拉路的。

甚至可以证明它是有欧拉回路的。所以这个这个面试题其实还是比较经典比较难的。因为它要这么转换一下,然后转成了这个欧拉回路的问题。这个是我今天要讲的5个题,做一下总结。首先就是理解递归。

我个人觉得这个呃例二吧那个问题是好多个小问题的一个总结,是一个框架的东西。基本上和树相关的都是可以通过递归这个框架来理解来解决的。那么第二个呢就是树的便利。这个其实呃可以说今天讲到了,也可以说没讲到。

因为我没有真的取这个前序遍历一棵树,后续遍历一棵树这种问题。但是我所有的那些递归过程,它的本质就是一棵树的便利。当然我们还要掌握这个前前中后三个顺序的非递归便利。因为有时候面试需要考这种问题。

那种就是我们要自己写对栈,自己慢慢的去就是把这个便利的顺序调整好。那么还有一些其他问题,可能今天没有时间讲,比方说最近公共组先问题。我本来选了一个这样的问题,由于时间关系没有讲。

那么最近公共组先有很多这个。呃,相关的吧,可以说二叉数的最近公共组纤,当然也有一般数的最近公共组先,还有二叉搜索数的最近公共组签。我们可以利用一些这个序的顺序。还有一个是离线算法和在线算法。

什么是离线算法呢?就是这个我可以把所有的查询都告诉你,我告诉你要求A和B的B和C的C和D的这些这些查询,我都告诉你是一个死的东西,你可以提前算好了,最后一块给我什么叫在线的呢?就是呃我可以实时的输入。

我现在告诉你查A和B的最近公共线。一会儿我说你给我查一下C和D的最近公共组线,你事先不知道那些查询,这个是离线算法和在线算法的区别。对于最近公共组签,它是一个很大的问题。那还有一些就是隐视图的搜索。

这个我之前讲BFSDFS时候都已经提及了。它涉及到一个就是普通图的话,涉及到了联通分量,这个是对无项图来说的,也有叫联通分支的,还有强联通分量,这个都可以通过BFSDFS来算。

当然BFSDFS不仅限于算它还可以算很多别的东西。对于隐视图来讲,我们要自己建图。比方说今天最后一个例题,请大家仔细理。😊,解我们那个图是怎么建起来的,为什么它就是个欧拉路托扑排序?

这个其实在算法和数据结构的教材上都有所涉及。但是好像据我感觉面试考的不是很多,偶尔有这么一两个会出现。所以在这里面提一下这个本课也没有涉及到托扑排序的内容。因为它也比较简单。好,今天的课就到这里。

谢谢大家,欢迎大家给我提出批评指正,再见。😊。

人工智能—面试求职公开课(七月在线出品) - P11:助力春招 - 七月在线-julyedu - BV1Xf4y1r74s

我大概是从这几个问题选了一下啊,比方说我们选一个涨停前问题,这一个古典概型哈,算概率的这种题目在面试笔试里面经常会用到,经常会考到哈。就是我不管是什么方向的,我是算法方向的。

我还是呃架构方面向的运维方向的,还是做这个呃设计师方面的,反正各种各样的,他都会考这种东西。然后呢,还有一个我们收拾这个众数这个概念,这个众数呢呃不算一个新题了,但是它经常很有用哈,很有效的一个东西。

另外就是这几次笔试面试里面经常会问到关于链表怎么样去逆序,这是一个好简单一个问题,就是给一个列表。然后呢,你把这个链表给逆序出来,对吧?本来是ABCD的,你看要把它搞成DCBA呃。

最好它的时间复杂度能够在ON,然后空间复杂度是O一的,就这么一个简单要求哈,然后去做一个链表的逆序。另外呢链表是各种各样操作都会有啊。比如列表的去重链表去重各种各样的变化。我们在里说一下,提一提哈。

另外呢我自己把一个面试的题目,就它太呃生硬了,生色了,所以我给它加了个背景,叫我给他起了个名字叫金钗赛师2一呢,我以前我分享过,我们说是这个金钗金钗赛失2这么个问题哈,它其实是一个呃带约。

数的排序问题哈。另外呢笔试里面面试里面经常会问问到一些这个逻辑思维的一些题目。比方说猜数字,我们等会看一下哈。另外呢就是大家思考思考一个jump这么一个很有趣的问题哈。呃,它其实可以看到是贪心动态规划。

广度优先搜索各种各样知识的。呃,一个点的一个应用很有趣的一个题目哈。呃呃首先是呃做个广告哈,就是那个我们那个呃企月算法,就是主来 IDDU点com这个我们的官网哈。然后这个大概是在今年的3月8号。

应该也就是在10天之后哈,我们开始这个3月的面试求职班。这是一个在每晚的2呃,每周的246晚上20点到222点去这个。😊,跟大家来讨论问题哈呃一周上三次课。我们这样的话,如果是分十0次课的话。

应该是在大概很快的时间就能够把我们所有内容都跟大家来讨论清楚哈。这样子利于大家这个更快的去呃做这个事。因为我们也想把这个更更快的把这个节奏加快哈,这是一个。另外就是我们在那个4月9号就是一个月之后哈。

开始这个机器学习班。这是呃2016年的第一期,我们2015年做了好几期这个机器学习班了哈,应该目前来讲还是呃我个人可以。我我觉得有点火爆异常,我感觉这个班哈这个继续一般。

我们在每周六的和每周日的晚上7点到9点、19点到21点,这个开始跟大家讨论自己学习哈,一周是双课的。呃,大概这是打纲了,我随便截了个图而已哈。呃,然后呢我们来看看这个今天的这个内容哈。

比方说我们看这么一道题目。很简单了哈,比方说我们现在有一叠纸币,5一叠纸币的意思指的是呃有若干数目,对吧?比如说这个5元的这个面值,我现在有6张10元面值的,现在有5张,20元面值的有4张。

现在呢我从这个我这个纸币里面哈任意的去选择4张纸币,要求这个我每种面值至少取到一张。那么说概率有多少。呃,这个题目哈,比方说我这里边我们罗列一下这个知识点哈,这个信息点就是有5元的、10元的和20元的。

各自是6张,5张和4张,对吧?我们要求的是至少有一取取的这个4张硬币的纸币里边。至少是每个面值都要取一张,至少他各自取一张,那一共4张嘛,那很然那黑显然嘛,有一个是两两个的嘛,对吧?

我们把这个东西罗列出来,大体上就能够把这样一个题目给做出来哈。我们来看一下,就是说首先哈。一共这里边这个5元10元跟20元。呃,我们看上面这一页哈,一共是这个,也就一共有15张,对吧?这一共15张。

我取4张,这个就是我基本事件的数目,就是我从15张硬纸币里面去随便的去随机取4张的所有取法,这个就是基本事件。对吧然后满足题意的这个至少有面值呃,每个面值至少有一张,这个是满足题议的这是有效事件。

我把这两个事件都求出来,一做除法。那么说它的这个。🤧根据古典概型的这个思路,那么说求的就是概率,对吧?所以我们需要做的就是求这两个东西。而第一个。很容易啦,对吧?一共15张,我取4张嘛。

这就是从15里面取4个的。一共多少种取法,对吧?这是基本事件的数目。那有效事件是怎么办呢?那么说我们就分三种情况,一共刚才说说了有5元、10元20元的嘛,那只能够是其中一种面值的,取两张。

其他两种面值的都取一张。比如说这个咱从这个5元,一共有6张,10元有5张,20元有4张。其议里边说的哈,然后我们如果是5元的,这个里边取两张,这个取一张,这个取一张的话,那6个里边取两。

就是这个然后5个里边取一个,就是这个四个里面取一个,就是这个所以这种情况对应的,就是5元取两张,10元,20元各取一张的情况,同理这个是10元里边的取两张,5元和20元取一张,这个是第三种情况。

他们三个加起来就是有效事件的数目,对吧?这个有效事件数目除以我们的基本事件数目,就是我们要求的。改率。对吧。这就是这么一个题目的做法哈。所以大家遇到这种题目之后哈,不要有任何的慌张和紧张。

就是如果觉得这个题目呃。看着不难,又不知道如何去具体做的时候,就把这个事件给他1。1点的给他分开。一部分一部分的做对吧?各个击破嘛,这个事情就出来了哈。😊,好了,这就是我们分享的第一道题目哈。

大家看有问题吗?😊,OK哈呃,这是我们现算是个电场哈,这是这种题目呢就是尤其是概率问题。😊,probability的问题为什么这么重要呢?因为目前哈说白了就相当于是我们现在机极学习太火爆了。

而机极学习这个东西呢,往往是统计机器学习。从那么写。统计机器学习统计机学习里面,它必然用到概率论,数理统计的知识,对吧?那这样一个东西的时候,那必然用到概率,所以它会考察你概率。

所以你大家再去做笔试面试的时候,往往会问你概率的东西,对吧?所以它的地位就非常高哈,这是我个人觉得它的一个为什么非得是考这玩意儿哈,对吧?而这种东西其实在实我们实践当中多的很啊。

比如说我自己杜撰这么多题目哈,呃就是比方说国粹麻将哈,我觉得这是一个技术和技巧跟运气相结合的一个广泛开展的娱乐项目。不知道大家在spring festival是不是进行了这样一个很好的体育运动哈。

然后这个假定我们现在去出花牌哈,不考虑这个。这个这个这个就是梅兰竹菊,东南这个春春夏秋冬那种花牌哈,这样标准的一个麻将哈。然后我们把它就是由万桥饼,这是从1到9的各4张,对吧?以及东南西北中花牌各4张。

加起来一共是136张麻将牌哈。现在呢我们把这个两张内容一样的牌,比方说两个8万两个四饼,对吧?这样的牌叫做一副将哈,呃,这个这个东西大家都很清楚,对吧?我只是重复一下而已哈。然后呢,现在我们这个庄家。

我今天我我我大骰子哈,我庄家我骑手,我摸了14张牌,对吧?这是我们的要求嘛。请问他起手的这14张牌里面没有降的概率有多大呢?对吧这个就是我们的一个。具体的题目对吧?这个题目其实可以有各种样的变化。

然后问你,如果不是庄甲,我是我正常的这个我摸13张牌,那么说我没有降的概率有多大?比如说我给大家算一下,我摸13张牌,没有风的概率有多大,所谓的风就是东南西北正方牌,对吧?这都是可以算的。

我呢跟大家算了一下这个14张牌里面没有降的概率。我算的结果是这个。还是那么基本算哈,130张牌里面任选4张有多少种。然后34组里面任选一组要求有两张,然后有多少种不同的情况,然后二者一除就得到结论了哈。

我大概结论大概是8%到9的样子哈,相当于你打个。十几次哈就会有那么一次没降,大概是这么一个情况,对吧?这是一个这样一个实际题目。所以大家在实践里面有各种各样的这个概率的问题,对吧?😊,呃。

刚才有朋友问到这个机器学习的好找工作吗?呃,小倩刚才那个说去年不好找啊,我其实个人感觉积极学习应该是非常好找工作才对哈,这是一个现在就是。就是你打开任何一个这个群。

然后这个只要只要是有一丁点关于积极学习的,比方叫大数据呀,叫hadoop呀,叫park,叫这个dom或者叫什么东西的对吧?或者叫python都行。他时不时的就会发这个我要招生什么人,如如如如何啊。

这所以这个行业现在是极其缺人哈,就是呃大多数人就是知道这么个东西,但是他不太清楚,呃,所以这个行业现在特别好找。我觉得哈我个人个人这么认为哈,呃这是这个内容哈。😊,呃,就是数据挖掘的。

我个人觉得就是HTIHTS刚才问了个数据挖掘,是不是我个人觉得他想说的是不是说我可以做一下数据的筛选,数据的清洗,然后特种选择倾向于这样一个。呃,内容对吧?而机济学习倾向于具体的算法。

它到底是如何去应用的代码如何写的对吧?这个算法可以用于什么样的东西,它里面的参数怎么回事,对吧?呃,如果是那样子一个认为的话,数据挖掘,我们应该会在这个呃今年的下半段在把这个内容准备好哈。就是。

这样一个分类啊,如果我们非要把数据挖掘跟新学习,看的是两根。方向的话哈其实是很接近了,对吧?呃,OK哈,这是呃这个问题大家就自己算就好了哈,就是我们身边的各种各样的概率哈,对吧?😊。

我们现在呢来看一个呃。已经。经常被大家在面试中所看到的问题哈,这个问题不算新,但是它很经典。就是所谓的众树。众数这个概念本身是来自于这个概率论的梳理统计的哈。你比方说我们举个例子。

比方说呃如果我们写一个呃sigma谬,假定是呃写反了哈,然后是根号下2派呃,不写了哈,平方呃写一下吧E的-2西格玛方分之X减谬的平方,这是高斯分布的概率密度函数,对吧?这个高斯分的概率密度函数。

其实它的概率密度是长这个样子的。对吧那这样在零处它的值是最高的这个点,它的密度最高。这个零这个点哈,我们就把它叫做重数。叫做重数哈。然后我们如果不去这么简单的去,我们如果不去这么深色的去给这个下定义哈。

我们来下一个比较这个轻松的一个命题。我们这么来说哈,就是假定给你N个数,然后呢,我们说出现次数最多的那个数就叫做众数,它最多嘛,对吧?

比方说这个咱分这个阶层全国大大多数人属于这个低产到中产阶层这个阶层里面,这就是我们的众数,对吧?就这意思哈,然后如果说有一些众数,它出现的次数大于了2分之N,那这样的话,这样子的重数。

我们把它叫做绝对众数,有些时候啊大家看这个呃文献也好,这个博客也好,有些博客里面直接把绝对众数简称为了众数。大家一定要这个清楚概念本身哈,就本来指的次数最多的就叫重数。比方说12132这么5个数里面。

谁的众数呢?一出现了两次,二出现两次。出现一次,所以一和二是出现次数最多的,他们都叫众数。但是他们其实只出现了两次,一共有5个数嘛,对吧?一共大N是5次嘛,所以说它不到一半,它不叫绝对众数。

但如果把这个二改成一一出现了3次,二跟三各出现一次,一出现的次数三次除以这个N5就大于2分之12分之1了。所以说这样一个情况就是绝对众数哈。这是只不过有些人会直接把咱这个概念里面的绝对众树简称为众树。

这个意思哈。我们现在呢来说这个题目,就是假定给了我们N个整数。并且我们已经知道这N个整数里面是存在着绝对中数的。请问你能不能设计一个最低的时空复杂度的一个算法?我,抱歉,这个写错了哈,这是时空。

最低的一个时空复杂度的一个算法。然后让我们来计算一下这么一个呃。绝对种树这么一个东西哈。呃,刚才呢有朋友问到了,那如果相等算不算,比方说这个东西如果是大于等于算不算,呃,那就压线算里,我们就算了好了哈。

这个无所谓,对不对?就是相等的情况算还是不算,对吧?压线吧,擦边,你说是界内呢还是界外呢,是吧?他有时候我们看我们策略了哈。😊,就跟大家在做聚类的时候,这个点如果归于这个聚体中心和这个聚体中心。

它是相等的。你说它属于哪个类别呢?属于谁都行,说不清,对吧?这个得看策略了哈。呃,我们来看看怎么样去算这么一个重数哈。因为我们想说的是用最样低的时工复杂度来算吧,对吧?呃,当然最简单的方案哈。

我们如果做统计肯定可以的。比方说这个开一个足够大的空间。对吧我们来说一下哈,你比方说这个数里边哈,我们可以辨一下这个数里面最小值。😊,和最大值,然后我们用max减去幂不是算出来了吗?加上一个一。

我们开这么大的一个大空间,我们记录大M,对吧?这个空间把它记录下来。然后呢,这个一出现了,O放到这儿二出现了,放到相同位置,三出现放到和相同位置。我们统计一有几个二有几个三有几个,我们唱票呢,对吧?

后来哪个值最大OK这个是一个中数。这种做肯定是可以哈。但是这样的话,他用到了这么一个空间,对吧?然后呢,有点这个哈希的感觉,我们其实可以不去用这么一个空间就能搞定它哈。

所以我们来说说它时空复杂度比较低的时候,如何去。呃,解决这个问题啊。我们来想一个事情哈,就是有一个非常重要的结论,想法就是如果这些A这么一个数组里面假定某一个这个值哈,它是一个重数,对吧?

假定它是个重数。那么说我们在这么一个数组A里边去删除两个不相同的数的话,绝对重数,它是不会发生变化的。对吧你比方说如果删的这两个数里边有一个是绝对重数,一个不是。

因为我本来我就占你总个的比2分之1还要多还要多啊。我我给你任何一个值删掉它的话,我剩下的还是大于剩下的2分之。呃,2分之0。2的对吧?这是如果有一个视觉的重数的话。如果这里边没有绝对中数。

删的是两个跟觉对重没关的那我觉得这数数数量会相对的而言,它的占略比例会更高,显然不会影响到绝对中数,对吧?因为我删除的是两个不同的数,所以不可能删除两个数都是绝对中数,因为我教它不同嘛,对吧?

这是我们的想法,而这个想法就是我们写算法的基础。好了,我们把它变成我们的算法语言。假定这个M是我们的一个候选的一个绝对种数,它可能现在不是啊那候选。然后呢,假定这个M出现次数是C,假定我们统计出来了。

而我们在最最开始第零位置的时候,这第N减一位,这是第零位哈,在第零位置的时候,这个M其实它的初始化的次数是零的,我们没有统计到任何信息,什么都不知道,对吧?现在呢我们从前向后依次统计。如果这个。呃。

C等于0,那就意味着我什么都不知道。那么说当前我拿到手的这个值,对吧?这个值我就认为是我的一个候选的情况,因为什么都没有,我就只能把你当前这个东西当我的候选,有总比没有强嘛,对不对?

然后那这样的当前这个AI我就把它复制为M作为我的候选的一个绝对重数。然后呢,现在如果说这个C是不等于零的,就是现在这个我现在统计的这个值A那个M是有效的,相当于。并且我发现这个M和这个AI是不相等的。

好,不相等,什么意思呢?我删除他们俩就可以啊。OK我就同时把这个M和AI键AI都给他删了。不影响我的绝对种树,对不对?这是这种情况。😡,第三种就是如果C不等于0,表示我的M有效了。

并且如果说这个AI这个值跟M相等,相当于我这个候选的证数又出现了一次,又出现一次。那么说这个它的计数就加加。对不对?这就是又出现一次的做法。这就是我们的算法描述。对吧现在我们。

到我们的代码实现就差一步了,这个等于零做它它等于它同时删掉,这个等于它加加这里边这个这个都是几乎是语句了,就这一句,什么叫删除呢?对吧。所谓删除的意思就指的是我现在哈这个M这个候选的这个绝对重数。

它已经出现了C次了,对吧?现在呢我出现了1个AI跟它不相等。我要把这个技数减掉,我才能够说删掉啊。所以所谓的同时删掉M和AI就是指的C减减。对不对?是不是这就是我们的这个呃情况。所以说这个就是C眼碱哈。

这就是我们的这个结论。好了,那这样子我们就能够非常清楚的写出我们的代码来了。就是假定说我们这个A是某一些这个东西哈,我们只不何祈求的种树呢?这个A是我们的?😊,数组,然后这里边是我们的这个size。

对吧然后怎么去做这个东西呢?我们就先给一个技数M是我们的候选值,等于零的话,我们就记录下来,出现次数为一,不等的话减减,否则的话就加加,最后把这M返回就可以了。简单吧?这样的话。

我们的时间复杂度是ON的,空间复杂度仅仅是O一的。对吧。好了,这是这样一个问题哈,大家看这个问题呃,有什么问题吗?😊,OK哈,就是刚才这个blue link说绝对众数只能有一个吗?是的,只可能有一个。

因为如果有两个的话,他们两个都是次数大于2分之N的,不可能。对不对?那那不可能出现这种情况,所以绝对众数只能有一只能有一个。但是众数可能有多个哈。当然我指的这个众数指的是狭义的那个众数哈。

就指的这个叫众数哈,这个叫绝对重数哈。为了区别这个概念,所以我特别强调这个叫绝对重数哈。其实是博客上大家经常称的众数那个概念哈。OK哈,刚才blue inch这个这个这个帮帮我们这个做了一个这个修正哈。

他说这个绝对重视的字数要大于2分之N,不能够等于N等于2分之,是不是这意思?嗯,好吧。这个这个我们就就多谢哈,我们就就就假定这个我们的众数不能够是等于2分之N的对吧?这是有有也有道理哈。

就你比方说什么意思呢?你比方说如果说咱的这个实际的这个数组哈是这种情况的,111222,这里边大N一共是6次。那么说一出现了3次,二出现了3次。那这样的话,我们根据如果大于等于是允许的话。

一和二都叫绝对众数,但是我们希望绝对众数有一个嘛。那我就说它俩都不是绝对重数,都要大于二分之才行,对吧?这样定义是有道理的哈。就是如果是我们说这个等于是不能等于只能大于才行哈,这样定义是有道理的哈。

只要是呃所以我们一定要强调是一个will defined。对吧只要是它是良定义的就可以哈,就是保证我们的整个的体系是完整的,不没有发生自相矛盾的这东地方,对吧?所以说我们强调他是大圆的人哈。呃。

OK这样这个问题清楚了吗?😊,🤧。呃,所以这个是否等于不是这个问题的重点哈,对吧?大家知道就好哈。所以从这个意义上来讲的话,呃,我们只能说是大于才行,对吧?然后呢,这个重点其实是这个东西。

比方说大家如果在笔试面试的时候。😊,如果你跟面试官讨论,他是不是等于也算的话,呃,可能不太合适哈。因为我们如果是在笔试面试的时候。嗯。🤢。

就去解决这个问题本身哈呃这这是我们的要不然这个会产生很多别的非技术层面的问题,对吧?呃,然后大家一定要重点放在这个位置哈,这是我们的重点哈,就是如何去把它解决出来,所以代码很简单哈,如果只看代码的话。

牺松平常,没有什么东西,后尾语一句A后语句谁不会写,对不对?但其实它里边的那个思想很重要哈,对吧?所以说如果大家呃千万不要过分的去看待代码是怎么回事哈,呃,当然代码很重要,它是一个落地的东西哈。

但是或许算法是需要大家来去深入的去理解的哈。😊,OK哈,这个问题大家看还有我们需要探讨的事情吗?我们来看看。😊,因为咱今天是一个公开课哈,所以并不是我们正式的这个呃正式的去这个跟大家去上课。

所以说这个我们可以把气氛搞得简轻松一点啊,不要跟我们上课似的结的那么快,那么紧张哈,对吧?如果哎这个ever问了个非常非常好的问题哈。呃,这个问题问的非常好。你比方说如果说我们这里边呃不是找绝对中树。

对吧,而是找一个这个众数,或者是找这个我们想要的事情里边哈。它会出现一个问题,我们来看一下啊,这个问题问的非常好,就是。绝对重什么意思?其实它指的是我一个数,如果是X的话。

它如果出现的概率是大于2分之1的,则这个X就是一个重数,是不是这意思?这就是绝对重数的概念,对吧?只要它的出现的概率是大于2分之1,它就是一个绝对众数。好了,如果咱把这个二变成K呢?

比方说X出现的它的频率是大于K分之1的,这个K是某一个整数,对吧?大大于等于二的整数哈。所以这样的情况,我们可以认为它是一个呃。或许就是满足有点接近众数了,只不过这个把这个二放成了K。

如果这样子大家记得吗?咱做绝对众数,咱的代码里边那个用的是M1个候选值是什么?是这个二减掉一个一,就是我们绝对众数的数目。如果是K呢,那我们需要K减1,所以空间复杂度就变成了OK减1了。

时间混杂度还是ON的哈。对吧所以说这是一个呃很好的一个问题哈,大家可以把这个东西作为一个很好的思考。我们这里边就不再是只是比较当前这个候选值和我拿到的这个AI这个值了。

而是需要这个AI这个值跟我这个K减一个值之间进行比较,对吧?这就是我们做真正的重,这个就是狭义上那个重数怎么做的事情哈。OK这是关于这个事情啊。嗯,还有别的问题吗?😊,所以我再多说一句哈。

所以这里面我们又会涉及一个更有趣的问题,就是这K减一个这个数,我们应该用什么样的数据结构存呢?对不对?还是一个很有趣的一个话题了。嗯,但time说没太听懂,哪没听懂呢?呃,其他朋友也没听懂是吗?就这块。

因为我们强调互动哈,就是说大家没懂,咱就咱就接着来。就是这里有这N个数哈,这N个数里边如果说某一个这个数,比方说这个数吧,比方说假定我们举个具体例子哈,1212113就这么一个实际的一个情况哈。呃。

1234没错吧,那这样的话,一这个值X等于一,它出现的这个频率是几呢?是4除以7。对不对?这就是我们的这个X等于一,它出现的这个次数4除以7嘛,这个频率是大于2分之1的,所以一就是一个绝对正数。

对吧这是我们的这个现在说的概念哈。呃,如果我们这里面不是取绝对重数,而仅仅是取算众数的话,我们其实这个2分之1这么一个定义哈,把它要弱化成K分之1。

比如说我们找一找这么N个数里面它出现次数都大于4分之1的。那个那些数有哪些你给我输出出来。对吧。就这么一个题目哈,那这样子我们就怎么办呢?我们需要三个空间。我们用一个M1个数组0123的空间来存。

因为这是4分之1。这个如果2分之1的时候,我们用的是一个M嘛,一个数啊,如果变成N分之1变成K分之1的时候,就K减一个数来去存啊。所以这个一个值就变成一个数组了哈。代码结构是一样的哈。呃。

这个代码如果没有数组里面没有绝对众数,返回值是不对的。就是小星星问这个问题啊,小星问个问题哈,因为我们这个题目题目说的是呃给定了这个数组存在绝对众数,那么说你给我返回那个值出来。

如果这个数组里面没有绝对重数,它返回值是不定的,是无定义的哈,这个东西,当然如果你非要说这个我们把它改造一下,就是我们能不能说没有绝对重数,我们一要让它返回一个就是特殊的一个值,对吧?就好了哈。

那你就找到这个M之后,再加一个for语句。算一下这个M出现多少次,这个唱票很简单嘛,对吧?我放一句走一遍,就是我找一下这个M出现多少次,这个次如果大于2分之s这就是了嘛,对吧?就反回正常的M。

否则就返回个特殊的一个一个值就是了。对吧所以那个再加一句也是ON的时间复杂度,就没有再提这么细的东西哈,对吧?呃,OK呃,这个问题还有问题吗?是。呃,别的说这个发一份PPT在群里呃,这个没问题哈。

这个肯定没问题。我们那个呃公开课结束之后,我们我把它放在群里就好了,这个没一点都没有哈。😊,OK哈,所以这个问题本身绝对中暑是一个非常经典的一个题目哈,大家一定要会你看。涉及的事情还是比较多的哈。

好了哈,现在呢我们看这个最近几次面试里面经常问到了一个题目,就是链表的翻转。我把这个题目呢又做了进一步的这个呃加大了一个难度。我们把这叫做链表的部分的翻转。就是我们给一个列表。

比方说这个123454制列表,对吧?然后呢,我们想让大家如果给定一个M和一个N,然后让你去把它给从M到N给翻转过来,比方说12345M从2N等于4。OK我们就把这个234这部分翻转成为432。

如此一道题目哈。显然,如果这M等于1N等于我们总共的这个大N的时候,其实就退化成我们的全链表的翻转了,对吧?如此一个问题而已哈,所以说呃链表的翻转这个题目。不难,他就是考察大家编码的这个基本功哈,对吧?

就算我来了一个郭靖,但是我不考你相十把掌,我考你是不是会爬山。就这么个题目哈,这这这种题目就是大家一定要落地,我们一定要清楚,对吧?呃,O。嗯。很多很多地方都考过这么一个东西哈。

然后呢怎么去琢磨这个事情呢?我们可以这么来想哈。😊,呃,首先我们如果真的我们呃考察这个东西把它翻转哈。你说12345,如果是全链表翻转哈,简单化也处理一下哈。那么说我们最最最最简单的一种思路。

OK我找到整个列表的最后这个位置,把它放到整个列表的最开始,再重新找到最后这个位置,再放到这个两个列表最开始。呃,放到这儿。呃,放到这儿,然后再保着它放到这儿,找到它放到这儿,然后就翻转完了,对吧?

然后如果是我们。从后向前去做这个事情的时候哈,其实我们会发现哈找到这个链表的时候,其实插入到当前位置的后面就可以了。对吧然后呢,我们其实这样一个简单的一个思路哈,就能够帮我们去完成这个过程。

我们来看一看啊怎么做呢?就是我们看看哎,我们先比划一下吧,比方说12345这个链表本来是这样一个结构哈,我们作为一个全链表的翻转。那么说我们就先找到整个链表的最后这个。这个值的时候。

把它最后这个特殊情况,把它先放到整个列面的头部。对吧然后怎么办呢?拿到这个四以后,放放到这个头部的下一个这个值。然后这个拿到这个三放到它的下一个值,这个的下一个值这个下一个值。对吧呃。

其实就是这么简的一个一个一个过程哈。如果只不过被个变成从2到4的时候,那么说我们就需要空转M减1次拿到这个。不要翻转这个二这个节点的前一个节点,它作为我们新的这个所谓的全翻转那个列表头。

然后只翻转这一部分,对吧?翻转N减M。加呃M次对吧?就可以了啊,所以我们是。加上这么一个前边的一个一个一个一个空转就可以完成这个操作了哈。另外呢呃我在代码实现的过程之中哈。

我习惯我个人习惯啊只是哈就是整个的链表。这个要看那个就是面试官给我们的这个要求,以及链表是不是给你了,对吧?就是说这个链表本来是123。45的。然后呢,这个如果给一个这个P或者叫P氦的对吧?这是头。

然后呢,我们有些时候这是P氦的本身一个一个指针指向它哈,有些时候。链表头的这个位置需要特殊处理。所以我们在实践当中哈,实只是实践当中,就是如果你在做。项目做编码,你需要做做事情的时候。

习惯当中我们加一个头节点。这个这是我们这个是我们真正的投机点行们查掉。这个不放在这儿了。我们是怎么做呢?就是。我们把这个。作为我们的头节点,这个头节点其实数字什么都不存,然后它的这个指针指向这个东西。

头节点的next指向我们真正的有效节点的下一个。这样子一来的时候,其他这些所有节点都是这个批head所指向的东西了。我们在处理代码的时候要方便很多,不需要做。

打补丁相当于因为你头头节点尾节点各种各样的特殊情况需要处理哈,容易带bug。我们加上这么个节点是方便的哈。但这个只是我们实践当中啊呃习惯这么来做。如果有这样一个方式的时候。

ok我们就把这个五拿过来放在这个批害的它的下面这个地方,对吧?插入到这个就可以了,然后插入到这儿之后哈,这个插入这儿了,对吧?然后这个4再插入过来,32呃一就不用插了,它已经在最后了嘛。

这样子我们就完成这个操作了哈,对吧?就这样子那个代码上简单一些哈。OK这样我随便做了个例子哈,怎么做呢?就是这是每小数本身行,这是结构体,就是value。所以我的结构很简单啊,前面是一个value。

这是个next,这就是我们的这个结构体啊,value跟next哈,对吧?然后初始化的时候,这个next初始化为空,这个value你给我什么值,我就初始化什么值。这么一个简单的一个结构题哈。

然后我们做一个Phead这个head这是一个刚才我们画的这么一个结构哈,它是一个。这个值这个value值存什么是无所谓的,我存了个零,我从来不会访问到这个节点啊,我要的是Phead the next。

这个是我想要的。所以我们这儿做了一个head,然后呢,我随便给了10个数数据哈,随机取取完这个值之后,把它给加进去了,对吧?如此而已哈,什么都不干哈,所以我这只是初始化这个列表用的。初始完之后呢。

把它打出来看看。然后呢,假定说我想做算法了,reverse如什么呢?这么一个列表从4到8这么一个位置把它翻转过来,然后再打印出来,再再把它破坏掉就是了哈,这么一个过程哈。而这样一个过程,其实他做法啊。

4到81234。5678这个东西对吧?把它翻转成为34呃,翻转就是了啊,就是可这个就不用说了吧,这就是咱那个。非常基本的刚才那个过程哈,只是说大家在做的时候,我在摘的时候,比方说我要摘这个34哈。

摘的时候我需要把这个呃。他先记录下来。对吧然后呃可以这么来考虑哈,就是说我们把这个要摘的时候,把这个呃。78先不管它把这个24线摘下来,放在这个78的前边。放在这儿哈,那相当于变成了写下吧呃。

58是头节点,然后摘成了24和78,对吧?我们再把这个69拿下来,69放在这个58和24的这个中间,对吧?我们再把零拿下来,放在69的前边,把这个34拿下来,放在零的前边,把这个它指向这个东西。

就形成3406924跟78,就这么一个过程啊。对吧所以我们是只要摘着一个节点,我们要集中记录的话,把它先暂时连起来,就这么个操作啊,没别的。OK哈,这是关于这种。😊,代码级的这种呃。方案哈。

大家看这个问题,大家看有什么。咱需要进一步来讨论的吗?这个是考了个基本功的哈。所以我们会发现就是从后向前去做的时候,因为我没有前驱不方便,对吧?所以有时候会用头插法。用投插法来做哈。

对吧我们就拿一个东西往前放,拿一个东西往前放就是了。呃。有点麻烦。这个大家没有问题哈。没有问题,就是最大的问题。O。没有问题最麻烦了。我们看看啊这样哈,就是我们现在想发展真。对吧我会翻转这个怎么翻转呢?

如果是这样这样翻转哈,那这是我们的基本想法。但这样的话我们会变成了ON方的时间复杂度,对吧?我们放弃这种想法哈,我们怎么怎么去做呢?我们这么来做,就是还是要去翻转这个东西,对吧?

首先你现在其实既然是这样的东西,最终哈这个我们要去做它呃,我们把这个78项不管它哈,拿到这个24。对吧这个24拿到手之后哈,怎么办呢?把24放到58和78的之间。对吧因此。

第一个放心环这一小孩做的事情啊,仅仅。呃呃这这个是空转哈,这个不管啊。然后这块是我们真正做的事情啊,就是把这个24放到58和78的之间。先慢一点哈。就变成什么了?变成呃646258。

然后这个地方是呃24、78、69这些东西了,对吧?呃,我没写错了。这个东西啊我们把24放在前边就是5824,然后78、69这个东西,对吧?然后呢,我们再把这个6呃这个里边呃,现在到了这个位置了。

我们再把69拿过来,放在24的前边。对吧变成了6462、58,后面是69、24、78,然后呃后面是034,呃,这是一个数一个数的,那就别混了。我的我的板书很很差哈,对吧?

然后我们把69再拿到24的前边来,这样子我们就把他们三个弄完了,再次去往下就到了呃零了,再把零放到这个69的前边,再把这个34放在这个零的前边,不行,做这个事情哈。对吧那这样的话。

我总是能够从前向后遍利一遍就能够完成这个代码。所以时间复杂度是ON,空间复杂度是O1。是吧就这么一简单过程。其实哈我们有时候把它叫投插法。😊,其实我觉得如果这个最近经常会考到这个链表逆序哈。

可能是想让大家呃进一步的来去呃。熟练的应用一下头插法这个思路啊,就是我们把这个节点放到这个头这个位置上来。因为这个ha哈对吧?它是容易拿到是58,一直是固定的。然后就拿到一个节点就放到58的这个位置。

拿到节点就放到58的这个位置就好了哈,就这么简单一个过程。呃,这是玄5难度哈,然后语言是C。😊,呃,或者一个专家哈。😊,就是CNCI加。就几乎可以不分哈,对吧?就是一个是大陆,一个台湾嘛,对吧?

几乎可以不分哈。呃。如果需要我们可以去做呀,就是视频上传到网上哈这个。这个咱看这个是不需要,这个没问题哈。python写的话,时间复杂度也是这样子的。时间空间或者都是这样子的哈,跟语言是无关的对吧?

就是咱那个做代码哈,我只是习惯于算法这么一个课程里面,我用C哈,然后积极学习那个课程里面,我希望用python。或者读的pyython啊,怎么怎么读这个这个东西。啊,语言问题不大了是吧?

就是你不管是用棍棒的,你还是用这个呃浮沉的,你都可以作为武器,一个是少林寺,一个是峨眉,他们都是很大的这个。泰别对吧?武器很重要,但不是最重要的事情。呃。呃,这个问题本身还有没清楚的地方吗?

这样哈呃大家再把这一段。这个手动走一遍哈,这块很重要哈,这是我们整个其他东西都是给他服务的,都是给这一部分做那个铺垫的啊,这一部分哈。🤧嗯嗯嗯。好了哈,这个就是关于这个链表的逆序或者是部分逆序。

它本身难度上差不多,部分逆序稍微难。一丢丢对吧?多了一个空转的部分,对吧?如此而已哈。呃,另外呢就是我们可以或许是可以做更多的关于链表的内容。比如说我们比它略难略简单一点的这个就是这样一个过程哈就是。

呃,给定一个排序链表去重。比如说给定这么一个列表。这个列表里面这个233这是排序的哈,已经升升序排完排序了。然后呢,这个第二个三出现过了。OK这个删不要了这个两个8这个八出现过了,不要了。

这个九出现过了,不要了,所以有可能会这样一个东西,我们就把它重复的删掉,只保留这个大家也可以去试一下这样一个操作。这个题目比刚才那个列表排序要简单哈,因为我们直接从前向后便利就可以了。

对吧所以说我给出了这个参考代码啊,大家可以看一下这么一个东西如何去。做这个他的这个。这个这个代码哈。另外blue link说是这个是不是这个是这个只是不是。适用于单向链表。呃,呃,我不我我就没读算法。

但是我我的意思我我是想说的是这个算法本身适用于单项链表,也适用于双向链表。就是呃单链表跟双链表,其实这个代码这个算法本身都是可以应用的,是没有问题的哈。这个是没事的。只不过如果是双向链表的时候。

我们可以用刚才咱说的第一种想法,就是拿到这个节点呃,然后尾节点之后往前走,拿到尾节点就是这样翻转,往前走往前走往前走,这样是可以的。如果是双链表哈。因为双链表有前驱呀。对吧有前驱的话就好办。

我从后向前我是能够找到值的,但是单列表我只能从前向后去找到值,所以我不方便从后后继找前驱,这就是。所以用单列表比用双链表要呃算法难度系数要高一点哈。就是数据结构少。如果给你双量表的,那这个题目就简单了。

其实是。只不过用双链表的话,其实相当于你要增加你的这个呃实现难度。你千万不要把这个就是列表别指错了就行了。对吧?这样的话列表指错这会产生极严重的问题的对吧?另外就是我们刚才说了这个链表去重的第一种思路。

就是我们O去重了,我们就把重复的给它去掉,对吧?这是参考代码哈。呃,搜down都是我自己写完之后编译过通过的哈,这个我测试过没问题的。第二种情况是这样子的,就是。

其实那个电网系虫可以这么来写这个代码跟刚才这个代码的去重思路是不一样的哈。如果用这样一个代码的话,有什么好处呢?可以去应对链表去重的一个变种的情况。就是如果我们这个题目要求是只要发现重复。

所有重复数字都删除,就是三个三删除了,不是把第二个三删三给删掉,而是把两个三都删掉,它的重复了吗,你就删了这个三个八都重复了,都删掉,就重复了都删掉,因此就变成了二这样一个简单情况。

如果这样子的一个列表去重,跟刚才题目都叫去重,但是去重的策略是不一样的,要求是不一样的。这样一个东西啊,利用第二版本的这个代码非常方便能够改写出来,改写之后的代码是长这样子的啊。

这是第三个版本的列表去重,大家也可以试一下,它到底是如何去这个。起作用的哈,这是一个很有趣的一个应用哈。🤧呃,另外就。🤧另外就是这个刚才那个。成员小王给了一个链接哈,就是刚才的那个链表的逆序。

链表的部分逆序,列表的去重及其变种。这么几道题目哈呃在lead code上其实是都有相关的这个练习的位置的。大家可以去这个打开li code。d code,然后去这个提交一下,是看懂们的AC哈。

然后我们这个3月份的这个面试求职班也。会强调这么一个事情,就是希望大家能够把我们讲的东西。在li code上去,这是一个公用的一个开放式的平台嘛,对吧?谁都可以去用的免费这个东西。

我们可以在这里面做呃锻炼我们的这个算法思维嘛。并且我们。在琢磨如何去。如果你这个lead code上做的这个就是我们讲的这些算法,就是课程中善业面试求理班里讲的这些算法。如果你在相应的li code上。

或者是某一个地方做的不错的话,我们看看如何去做呀。呃,合理的奖励哈,这个我们再待定。哦,原理我们再说一下哈,原理很简单,就是你比方说我们刚才以这个为例吧。比如说如果是这样一个列表去重的概念的时候。

我们就拿到手这个二和它的next这个P和它的next。如果这个P和next不相等的时候,那么P和next都往后移一个。对吧如果说这个P nextt它在相等的时候,next就往后移一个。如果不相等了。

这就直接把它连过来就行了,对吧?同样走到这也是一个道理啊。这个P如果跟next相等了,next往后移一个P next还相等nex再往后移一个,不相等了,他们就移过来,这样子不就把它给去掉了吗?

就这么一个过程哈。另外这个题目要求的是这个链表是排序过的,排序过的意思,排序它这个给的这个条件其实过强了哈。其实我们只需要它是分堆的就行了。如果不是分区呃分区域的,就是重复的节点不在一个相同的位置上。

我们是没有办法做到ON时间复杂度的算法的。对吧我们必须把它给分区域才能够做成哈。这样的话,如果不是排序的,我现在的想法,如果基于比较的排序,如果基于比较的这种策略哈,至少得是N。

成log的时间复杂度才能够搞定这个事情哈。如果是这个无序的情况。呃,所以就需要一点这个。做点别的事情,先把它partition掉,然后再去做做这么一个过程过程哈。嗯。😊,好了哈,这是关于这个链表的这个。

各种操作啊,这个操作很重要,他重要到他是看基本功的,看你是不是只光会这个。就是是就是就是这个表达一些,就是口语表达一些我做过什么会做什么啊,还是你真正的会把它落地实现出来哈。所以有些这个公司他会。

重视这个东西啊,所以大家也相应的琢磨琢磨这事情就好了哈。然后我们来看这样一个题目哈,就是说。嗯嗯。大部分人说是不用休息,我就不休息了啊。继续就是假定说我们现在有个赛世会,这个十二金钗呢又聚在一起了哈。

各赋诗一首。现在呢这12个人各自随机的去挑选了一首,就是每个人挑的是这个各自的情况哈。只不过呢这个。😊,呃,有种情况就是我可能随机拿到手,我可能拿到我的诗了,我也有可能拿到别人的诗了。

现在李玩作为这个对吧?他他老大家的嘛,对吧?然后他就说了,说我们现在哈通过这个两两交换的方式,我们可以把换回我们自己写那首诗,但是呢有个要求你们任何人做交换,只能够跟我进行交换。

就如果比方说哈假定这个宝带之间。呃,要呃没没没没没有宝哥的事儿啊。然后如果是这个代拆之间哈,他们俩之间恰好是拿反了,就是黛玉拿了保钗的,保钗拿了黛玉的,对不起,他们不能直接交换。黛玉的先和李玩的做交换。

然后呢这个。宝钗再和李玩做交换,这样子才能够完成他们之间的交换过程哈,我们这是李玩的要求,人家对吧?说了算嘛,那这样一个要求的话,现在我们假定这个现在我们十二金钗是这样一个人物哈,这是十二金钗的名字。

现在呢他们各自拿到手的律师是谁呢?比方说这个黛玉拿到了西凤的,然后宝钗拿到了黛玉的完元春拿到了迎春的等等等等等情况哈。然后这个有可能比如说乔姐他拿到了他自己的这是有可能的哈,对吧?

现在如果有这样一个情况的话,你来给我算一下,这样一个情况,至少需要多少次的交换,才能够使得所有人能够换回自己的那个诗歌那个律师。这么一个题目哈,首先我们先说一下这个题目想做什么,大家清楚了吗?😊,🤧K。

所有人都需要拿到自己的诗哈,不是只是李白拿到自己的就结束了。啊,可以,如果李凡现在拿到自己的了,但是黛玉跟宝钗还他们之间正好是互换,那只能是黛玉。黛玉跟李王换,然后李玩跟宝钗换。

然后他们直接再再换一次哈,李完了再换个自己的。呃,所以李白拿到自己的。可能整个的过程还没有完,我们继续继续继续画。这是我们的要求啊。题目呃题目让做什么清楚了吗?呃。

程序员小王这个问题我不知道我表述清楚没有啊。O。题目清楚了,咱现在问题就是那如何解这个题目呢?对吧那如何解这个题目呢?你比方说我们来看我们来真正分析分析这个情况哈。你比如说。这个黛玉拿了吸凤的。对吧那。

西仲拿的谁的呢?吸凤拿的是宝钗的那宝钗拿的谁的呀?宝钗拿的是黛玉的呃,黛玉拿的是吸凤的。什么意思?就是。呃,黛玉呃,那个黛玉指向了这个西凤,然后西凤呢,他其实指向的是宝钗,然后宝钗指向的是黛玉。

黛玉又指向了这个西凤,他们四个形成了一个环。各自拿着各其他人的这个这个这个这个是四角关系。呃,对这不就这意思嘛?是是44个人嘛,待遇保钗三者关系是不是?抱歉啊,三角关系对吧?然后呢,也可能是有四者关系。

比如说这个元春拿的是迎春的迎泰迎。呃,迎春拿的是碳春的,探春拿的是西春的西春。西春拿的是元春的四四个春,各自是四角关系,对不对?也可能有特殊的。比如说李玩是特殊的对吧?李玩拿的是妙玉的,然后呢。

妙玉拿的是李玩的对吧?他们两个是两者之间的关系。对吧这都有都有可能的。但是我们发现一个情况,这里边这N个人哈这N个人,如果我这个人拿了这个人的十,这个人可能拿了另外一个人的十。

另外这个人可能拿另外一个人的十。如果在某一个地方的时候。没法去形成这个环路是不可能的。因为这12个人拿了12首诗。最大最大的环儿就是这12人形成的是一个大环,12人。

否则那就是可能各自的小团体形成若干个小的小圆桌,各自形成的环,对不对?这是我们的这个基本的一个原理,一个想法。所以说所谓的这些人互相交换啊,错乱的排序之后的一种情况,其实就是形成若干个小环儿。对吧好了。

我们再来分析这个弄的小环儿。比如说这个小环里面。如果这个小孩里边哈他是带着李玩的,因为李白特殊嘛。对吧李玩如果拿了,比方说第一号人的第一个人拿了第二个人的,第二个人又拿了李玩的,比如说哈对吧?

那李玩是特殊的,然后拿了一号人的,一号人拿了2号人的,二号人拿了李玩的那如此一来,我们怎么交换呢?那就是一和二做交换,对吧?然后交换之后的话,这个一放在这儿,A放在这儿。然后他俩才交换,对吧?

这样子他们的交换。就能够保证这三个人已经是各自拿到自己的了。我们说个最简单的,比方说李玩现在拿了妙玉的,妙玉拿了李玩的对吧?那怎么办呢?李玩跟妙玉交换一次,这是一个两个人所形成的环儿。

是吧两个人性神环需要交换一次。对吧如果是三个人所形成的环儿的时候,需要交换两次,大家可以自己对吧?就是刚才这个举例子哈,所以如果是N个人形成的环儿,需要有N减一次的交换。

就能够保证代理完的这个环儿需要有N减一次交换。对吧。这个清不这个清不清楚?稍微慢一点啊。这清楚是吧?好的,我们再来考察,如果形成的环里边没有理完呢。对吧这个环里假定一共有ABC这三个人都没有L。

都没有理完这个人怎么办?我就随便从这三个里边随取一个A。比如说哈放成L跟它做一个交换,那理完不就进到一个环里去了吗?那这就是形成一个带理完的一个长度为N的一个环,对吧?我再交换N减一次。

他们不就都对了吗?完了之后,那个这个A再和那个人做一个交换,再换回来不就是了嘛。所以最开始换一次,最外面再换一次,中间有N减一次,所以是N减一加一再加一对不对?这是加一加一是呃。

交换之前有一次交换之后有一次,对吧?所以不代理完的环需要有N加一次的情况,就能完成交换,代理完的环儿里边需要有N减一次做交换。这不就是我们的算法的思路吗?所以我们就从黛玉开始看看黛玉找到吸缝。

从我们再准把它擦掉哈。从这个黛玉找到西凤,从。西凤找到宝钗,从宝钗,我们找到呃宝钗宝钗找到黛玉,这是一个三个人的环儿,对吧?没有发现李玩既然是三好了,我们就把他记做4,什么意思呢?

这个三个人需要交换4次,因为我们随便找一个人把黛玉吧,他跟李玩的那个人李玩那个做个交换。其实他换的换到手的是妙玉的哈,无所谓,对吧?反正我们换一个就是了,换完之后呢,这是呃他们他们仨带着李李玩的了。

对吧?我们再再他换一次是了互相交换,然后再再弄,对吧?只要带着李玩就行。对不对?所以说三个人的这个哈需要4次。那我们再来看这个就是就是所以这个待遇。呃,保钗和。呃,我这里擦掉哈这个。稍慢一点。

我们举个例子好了哈,黛玉、宝钗和西凤他们仨就结束了,这是需要4次,对吧?再看元春。他是探春的呃,元春拿到迎春的,迎春拿到探春的,探春拿到西春的西春拿到元春的这是一个四个人形成的环儿,需要几次呢?5次。

因为没有已丸,对吧?然后这个湘云拿到湘云的,这是一个人形成的环儿,没有李完。加一呀,对不对?还是那个策略嘛,所以他就是需要加一次,对吧?他虽然他自己是哦,抱歉哈。😊,抱歉抱歉抱歉抱歉。不歉不歉不行。

这个不对啊。因为这里边特殊就是这个呃西香云这个他自己跟自己已经是拿到手一样的了,这是已经达到目的了,所以他只需要0次,什么都不要,对吧?然后这个呃妙玉。用用这个符号吧,拿到手的他是李玩,然后李玩是妙玉。

注意这个是长度为2,但是呢带着。理完了,所以他就减一,这个都是N加乙,这个是N减1对吧?然后还剩下。呃,清可清可清是拿的是。拿着谁的?哦,抱歉,我我说反了,对不对?就是李白拿的妙玉的妙玉是哦。

妙玉拿的是哎,那可清呢。可清在哪?可青拿的是李玩的。好吧,不管了,反是三个人形成这两个嘛,是不是这意思?呃,大家自己看就好了哈,我最后说乱了哈,总之之前做法是这样子的。

就是并不是12个人一定交换11次或者是几次哈。总之是我们就从前向后把它打成环就是了哈。它试几就是几,如果代理完就减一,不代理完就加一就加完就是了哈。所以整个的这个策略哈。

我们只需要ON的时间复杂度去把它给便历出来就行了哈。这个题目的代码是这样来写的哈,这就是这个题目的代码本身这样一个一个东西啊,它做的就是这个交换而已,对吧?看它这个如果它相等了就不算了,对吧?

不相等的话,我就去算它。这个只不过因为是正常而言都是要加的,只不过代了理完要减,所以我最后加了这么一个操作啊,我我自己算了一下这个值,这样这样做是代码简单哈。对吧这是做这个事情哈。

另外呢我这个题目其实只是做了一个这么一个故事背景哈。这个题目在实际面试里面经常会被问到。比方说google问到这么个题目哈。呃,这是google的面试题哈,google的面试题出的非常生硬。

他是这么来说的,就是我现在题目里面给定你了12个整数,然后呢,这12整数是从0123到11的,只要求这些数能够只能和零交换,最终形成一个生序的数组问至少需要有多少次的交换。

这个题目其实我就是把它杜撰出来的而已哈,因为这个题目原始说法就是这么说的,只能和零进行交换,形成一个升序数组,需要有多少次的交换。就这么个题目哈如此而已啊,我觉得这个声音太太生硬了哈。

所以我就加了个背角而已。没别的哈,这就是这个题目的这个内容哈。好,大家看到这个题目本身知道怎么回事就好了啊。😊,好了,这个是跟大家解释过的这个事情哈,就是包含零的跟不包含零的,就包含理完跟不包含理完的。

其实是一个是减一个是加一,对吧?所以它的呃。哦,因为这里面我们需要环,所以空间复杂的也是ON啊,对吧?因为我们需要把所有的人这个先记录下来哈,是否访问过。好了,这就是关于这样一个题目哈。

我不知道这样大家清楚了没有?😊,有没有没说清楚的地方,咱再讨论讨论哈。😊,啊,是的,妙玉拿的是可清的,可清拿的是李玩的,李玩拿的是妙玉的啊,他们仨他们他们仨是一组啊,对吧?乔姐跟乔姐自己是一组的对吧?

没错哈,他们他们他们仨是一组啊。呃,这个应该在li code上呃,我不知道最近它是不是有更新还是那个什么哈,我我我是不清楚是不是有的。或者说我不知道我不知道有没有对应啊,应该是没有啊。😊。

这个题目算是比较新的一个google的面试题目。算是比较新的啊。所以他代码很很平常,对吧?就这么做就是了。所以他的背后的思路很重要哈,就是到底是是如何做的哈。🤧うんうん。哦,是这样哈。

就是说这个我这里边这个C哈,其实统计的数目正好跟这个L它差了个一,所以我大多数都是加了个二的。这个这个这个C哈,所以大们加了二的,而里边这些环哈。这不管有多少个环儿,有,且只有一个环是带理玩的。

所以说我最开始做for语句的时候,我不管是不是代理完,我都给你加2。然后呢,那最终肯定是有一个我多多算了,我让他减回就是了嘛,我就这么干的。所以我代码里面这么写的哈,呃就是只是投了个投了个巧。

要不然咱做代码它比较比较乱,所以我稍微的改了这么一小下哈,其他的没有什么变化哈,我只是做了这么一个变化。呃,代码是这样子的啊。O我们看20秒。那这样我们就继续来那个呃这个题目不细说了。

但是它其实很重要了,就是说呃这应该是。那个应该是京东,好像是我记得哈那个题目哈,这个应该也是2016年的题目哈,是这样,就说假定我们有两个聪明人,所谓聪明人就是他足够聪明哈。

然后这个假的有A和B这两个人来玩数字游戏,猜游戏啊,他们在脑门上贴一个字贴一张纸,然后写上一个正整数,并且这两个正整数只相差一,这是第三个人给他们做的啊。现在呢A和B只能够看到对方的这个数。

但是看不到我自己的这个数。现在呢假定这是两个人的对话。A说了一句,A看到了B的那个数字,根据那个数字来猜它能不能断定我这个数字是什么?这京东的题目。所以大家看得清看的那眼书啊。

另外我们在那个呃7月题库APP里面。呃,应该是到7月题库APP哈,这是那个我们去年那个下大力气做的一个这个。呃,就这个app哈,就这个手机app,然后那个应该是安卓版跟那个IOS版都有哈。

大家可以在各大那个平台上去搜索这个词都能找到。呃,然后。🤧查掉。呃,抱歉。🤧。🤧最近这个感冒哈,这个病毒老是这个跟我很客气哈,不愿意走。然后呃这样一个对话,就是A呢看到了B的数字以后。

他去猜自己的数字是什么。看了之后,他说哎呀,猜不出来,不知道。然后B通过A的那个数字以及A的这个说的语言说我也不知道。然后B看到听到这两句话以及它的数字之后说我知道了。B呢也说我知道了。

就这么一个过程哈。那我们说请问第三方的你能够帮这个在回忆就是在那个我们重新来推演一下这个过程,计算一下A和B各自的数字是什么吗?🤧就这么个题目哈,这个题目呢我想说的事情是什么呢?就是是这样啊。

就是说他这种题目可以怎么去解。你比如说他不说我们要求放正整数,假如说A这个地方跟B哈。如果这个B脑门上贴个一,这个A这个脑门上贴一个2,如果是这种情况的话,A看到了B上贴的是一的时候。

因为第一他们都是正整数,并且都差一。如果B切的是一,我只能是2差一嘛,我还正整数嘛?我不都是零啊,差一对吧?我是正整数嘛,对吧?所以A只能是2。所以如果A看到了是一的时候,他一定会说我知道。

对吧就不可能出现我不知道这么一句话了。😡,我们继续哈,如果说这个A和B这个。呃,还是这样一个情况吧。呃,不行,这样情况吧。这样一个情况,如果是A,看到是一个2。A如果看的是二的时候哈,它A我就猜了哦。

我有可能是一,有可能是3,所以说A会说我不知道。对吧但是B不一样啊,B他如果看到A是一的时候,他会说我知道。因为我通过刚才那个例子嘛,我B看到A是一,我就会说我一定是2。所以说B就会说我知道。

所以也就不会出现这种情况。我们就利用这样一个。思路不停的去往下推演就够了哈。就这么一个一个过程啊,所以这个题目纯粹是考察大家的逻辑思维能力,是不是能够把整个的过程想清楚哈。然后呢。

在那个企业提供app上,我有这个过程的详细的一个这个。讨论哈呃另外呢就是我想说的这个事儿哈。我个人觉得是这样一个这个东西我没有在写的那个。呃,切提过M上。

就是说我个人觉得这个题目其实我们可以借助于二叉数,当然也可能是N叉数来去做辅助推理。比如说A如果看到三的时候。对吧我如果看到是三,那我就会猜了,我可能是二,我也有可能是4。

对吧然后我再去看那个如果我是二的时候这个。🤧另外那个人哈,我的对方那个人B。😊,他就会看到。他会猜到我这个是一或者是3,这是B的想想法哈,这个2跟4是我的想法,对吧?这个是三是我看到的情况。

这个是我看到的,这个是B猜的这不一样哈。如果我能够断定在某个时刻,我断定出来一和三B都是不可能做出决策的。那么说这个整个的这支就被减掉了。那么说四就是一个答案。我们可以利用这样一个结构去帮我们做推理哈。

这是。我觉得这个我我我把它构造了一个,就是我。瞎述了一个词语啊叫做推理术。我不知道这个说法对不对哈,所以。可以一定程度的帮我们做事情,要不然整个的大家推的时候就推乱了。就是这个东西啊。

大家可以把这个作为一个有趣的一个事情哈。另外就是想说的是。说话顺顺。是不对称的情况。就是我如果说A,如果说一句话,B去听到的时候,对于A来讲没有任何的新的信息出现,但是B可不一样。

B知道了A不知道或者是知道我知道你知道跟我不知道你知道这是两码事,对不对?这是享受这个事情哈。OK啊,这个题我们就不再那个详细的去探讨,因为它那个推推起来还是有一点点长度的。只是跟你家说一说这个答案。

保计算机的这个人哈,一定要这个能够有一个比较好的一个逻辑推理。这个能力哈。呃,另外呢我付了一个题目,付了一个jump。这个题目还是很有趣的一个东西哈。呃这个题目在例的课程是有的。然后呃这个题目这么说的。

就是说假定我们现在给定一个非负的一个整数的数组,假如给了这么个东西哈。然后呢,初始化的时候呢,我们在数组最开始放个机器人。这个机器人可以去往后去跳一个步数,跳到最大的步数就是这个当前这个位置。这个值。

比方说他在这个当前这个位置,它最大能够跳两步,最大能跳到2。当然他可能可以跳一步啊,对吧?如果跳到这个一了,那么他最大只能跳一步,跳一最少能跳一步,最终他可能跳到最后,对吧?假定是这样一个情况。

那么说请问给定你这么一个数组的情况之下,那么说你最少需要跳到步数是几步呢?这就是这个创业问题哈。比方说这个问题里边我们第一次能跳2,但是我们其实可以只跳一一次跳一步,跳到3。从三跳三不怕到最后了。

对吧所以说这是这样一个最少需要跳两步,对吧?这个对于这个数数字来讲哈,那么说我们编程如何实现这个东西,能根一串数字,你怎么知道我最少需要跳几步呢?就这么一个问题哈。呃,这个问题。这个问题我们说说吧。

我这个呢我我们正好有点时间哈,我们说说吧。🤧うん。😊,啊,我稍微等一下哈,这个题目上做什么清楚了吗?😡,这个题目上做什么?🤧OK这个题目需要再再阐述一下是吧?🤧。这形式这样啊,就是说。😊。

我给1个23112,然后呢,我最开始的时候机器是放在这个二这个。这个位置上,然后呢,它最大可以往后跳两步。当然他也可他可以跳一步,最大可以跳两步。然后比方说他如果跳两步的话,就跳到一了,对吧?

那么说最大只能跳这个一跳一步,最大跳一步跳到这儿跳到二结束了,对吧?到尾了。那这样的话,如果这样跳的话,12三跳了3次。那么如果是他选的另外一个跳的方式,先跳到这个三来,再跳一次,他只需要跳两次,对吧?

有各种各种跳的方式跳到最后的尾端,请问跳的这个步数最少需要几次,就返回这个最少的步数哈。哦,这是题目是吧?呃,这个题目清楚之后,大家会看到有同学说DNF。那深度音员搜索行不行?然后比如说DB。

我如果是动速动态规划行不行?我们来琢磨琢磨这个东西怎么回事哈呃,我没有。🤧实在抱歉这个。🤧嗯,正要赶上这个什么了。呃,我没有那个给截图哈,我自己画一个吧。我们来想一想这个事情哈,就是这么来考察哈。

嗯嗯嗯。🤧。假定这个是我们的数组,它最开始可能位于这个位置,对吧?假定这个值是某一个值,对吧?那么说它最大可能能跳涨到这儿。对吧最大能跳选这么多步啊,那什么意思呀?那就意味着我其实。😡。

第一次跳跃的时候,我最远能到达这个点,比方说这个点我叫做J吧,对吧?这个点加起它叫做I哈,那相当于我最远能跳到这个位置的时候,我最远能控制到J,最近我能控制到哎,我当前这个位置,我从前后跳嘛,对不对?

那么说我在下一次去跳跃的时候,我就怎么办呢?我就拿到这个值。和这个值和这个值这个值这个值这几个值都都都拿手啊。我来看一下。从这个位置的这个这个这个这个值哈叫这是AI加一,这是最大能跳几步,这是I加一。

这是这个值的位置,它一加对吧?它一加其实就是这个点能够跳到最远的那个位置。然后这个值也一样的,就是我从AI加2这个位置。这是我能撬的最大步数,I加2是我当前的位置,它俩一算完是这个点能够到的最远的位置。

这个点也能算这个点也能算,对吧?所有这个点都变定完,所有这些值的最远的那个值可能在这儿,这是这一撇。对吧这个是我这样一步的最远的这个位置。OK这就是我跳第二步的时候的这一撇。我再去判断。

从我拿到手的这个值开始,这个J开始这个这个这个这个值啊这个这个J开始这个J就变成这个I哈,让这个I等于J做这个操作,这是新的I了哈。然后IJ拿到手拿到这个东西,我再做相应的扩展,就是从它跳多少步。

这儿跳到哪儿,这儿跳到哪儿,这儿跳到哪儿,每一个都做这个操作,最远的那个步数,这个J又得更新了,每一次做的这个事情。哪一次啪跳到了最后那个数组位置上去了。那么说经过了几次就拿到手了,扩展几回就行了。

对吧这其实就是整个这个ju的基本思路哈。我不知道这样说清楚没有?这就是这个过程。不停的把这个IJ做扩展就是了哈。所以第一次的时候哈,第一次的时候,我拿到手的这个数组就是从0到0这个简单的这种情况。

对吧我我我当前在这儿,我就往扩展式了嘛,扩展就变成了一个从一到某一个数的一个情况,再扩展到了一个某一个数到某一个数,对吧?最终。这个区间的右边这个值达到了N减1OK就结束了。只要大于等于N减1。

我就直接返回,我扩展几次就行了哈。对吧。所以大家看哈这样一个思路是什么东西呢?首先我其实是把每一个点它的后面的最它的这个最大值,它的最大值每次都是求最大值,然后去做的。我可以认为每一次去计算。

只是去对IJ这个节点做扩展所得到的。跟前一次这个I两撇这两撇是无关的。所以我可以说这是一个贪心的思路。gded两个亿啊gradeded的一个思路,贪心的一个思路,贪心法。

另外这个东西我可以认为这个从IJ这么一个节点,它可以扩展成为这个I加一扩一个东西。I加2个东等这个东西里边我求最大的一个情况,得到一个新的一个节点。I一撇这一撇。

然后再扩展得到一个新的一I两撇这两撇到I3撇这三撇,这其实是一个数的一个程序便利。对吧。我可以说是一个数的一个程序便利的一个过程一个一个一个题目。

另外呢我会以认为这其实就是最开始这个节点不停的去把这个图做搜索。而这个搜索呢是一个广度优先搜索的过程,是1个BF。对不对?是个广度无权搜索。而另外呢,其实这个题目既然贪心法是可以做的。

我也可以认为在当前这个节点,它最远能跳多少。这样一个状态,我可以做动态规划转移方程呃,DP其实也是可以解释它的。这是这个题目所蕴含的这个算法内容哈,是什么做的其实无所谓了。但是其实它里边。呃,这个。

代码是长这个样子哈,看你怎么解释,怎么样来看待这个代码。好了,这是关于这么个题目哈。所以我这里面说了一个所谓的所谓的知识挖掘哈,你可以把它看作是一个广东院搜索,可以认为是个贪心。

可以认为是一个这个锻炼规划,锻炼规划也可以做哈,用这么个状态转方程也是可以做的。😊,呃,另外呢就是说呃咱在图论呃,就是咱这公开课了啊,就是咱那个呃专门讲图论那一次的时候。

会谈到这个广度语言搜索跟视言搜索它的各种各种情况。什么情况是用广度语言搜索方便的。什么情况是用声言搜索是方便的哈,我到时候再有有有机会咱们咱再谈了哈。另外呢就是我留一个小卡。

就是这样一个代码是每一次都去做扩展I和J做扩展得到的这个代码上是长这样子的,就是有一个well要循环这个或语句,对吧?请问这个代码的时间复杂度是多少呢?大家不妨来思考思考哈。这是这个题目的这个内容哈。

好了,这个是关于丈夫这个问题的这个相关的一个探讨啊。大家看有问题吗?嗯识。这个题目应该是在li code上也是有相关的这个提交地方的哈,大家也可以去看一下哈。😊,把它那个代码提交上去。

试试这个有没有理解清楚这个过程。我这里多写了一句。我记得就是说如果这个整数这个这个数组A哈,它如果里边存在负数的情况,它可能跳不到最终的结果上去,深陷泥潭之中,它可能跳不过去。

所以我这里有一个有一个这个区间为负反为负一的情况啊。但这个如果是给定一个正整数的数组,这句话是不会出现的。大家知道就好啊。OK哈这个。😊,呃,这个题目可能稍微有点难,是不是?

然后大家这个问问题的相对而言不多哈,然后呢,这个大家这个把这个题目再稍微的这个思考思考它里边涉及的问题哈。当然可能咱在做的时候没必要思考,想这么多事儿哈,就是他到底是广州还是这个贪心还是做的规划。

还是各种各种东西啊,咱先把这个事儿先做代码先写清楚,它的思路算法要理清,对吧?OK哈,这个大概呢就是这样一个跟大家聊的一个内容哈。另外呢就是这个呃一定要重视这个思想,重视咱动手的实践能力啊。说到底。

计算机作为一个实践学科,我们需要掌握至少一门的编程语言,对吧?呃,并且提高内涵啊,我觉得是引起所有对战平台的一个终极反驳。对战平台包括各种各样的情况,对吧?另外一定要重视教书证的基本内容。比如说问你。

你给我实现一个无bug的一个快速排序。这是一个。经常会是在一个在这个面试中问到的一个,你给我实现一个就好了嘛,很简单,对吧?又不难,你需要当时间做完呢,对吧?写一个这个东西对吧?

然后呢呃掌握内容要全面哈,我个人觉得啊,比方说我大家大家都学过队列,对不对啊?如果问大家优先队列是什么?在教科书上大家学到过吗?事实上早就知道这个东西哈。堆对吧?优先度点大家可以看一下哈。

比方说问大家字符串的全排列,那么说你如何去做这个算法的设计和代码哈那这样的话其实。这个呃我们这里是想问的就是,如果这个字符它是有重复的,怎么去办?如果这个字符它是这个我们需要做这个代码,可以怎么去做?

如果是做非子代码,可以怎么去做?所以这个题目里边啊会会解示出来很多很多很多有趣的事情哈。比方说康托数组就可以从这么一个题目里面把它给引出来哈。OK哈。

这是我们今天跟大家来讨论的这个一大体上的一个技术层面的一些话题哈。另外呢就是ok我们再说一下这个事情,就是我们在3月的时候有一个面试求职班,大概是在每周的246晚上去上课哈。

然后4月份有一个这个地济学一般是每周六今天我们谈的实地学就很少了哈。我们只是大体上去跟大家聊一聊这个面试求职的一些内容哈。😊,呃,另外呢刚才刚才就是刚才这个主赖传过了一个消息哈。

就是呃我们那个面试求职班里面哈这样子哈,就是说在今天只有今天哈,就是他说呃单人去报名是8折。只有今天一天哈,就是刚才刚刚告诉我的就是。呃,因为我们如果是这个微不对发微博啊,三人成兑啊,各种各样的东西。

对吧?今天是直接叫名就8折就是了哈。刚才告诉我的哈,然后大家知道就好了哈。呃,然后另外呢就是如果大家有更多的问题。更多的问题,我们可以在这个。这个我们的那个官网上。

就在EDU上跟大家做更多的社区上做讨论哈。呃,that time说这个3月求职班上完春天来得及不?呃,我们算的时间算的这个感觉应该差不多哈,并且我们曾经是做过,有去年做过一个8月的面试求职班。然后呢。

当时是基本上是呃大家边上课边做面试。有了这个更新的题目呢,我们在里面做讨论,然后再迭代做更多的这个。给下一次面试做准备哈,所以都是可以这个。算是有这么可以经验的,就是小倩说这个事情啊。

就是边看边去边上课边求职,有这么一个迭代的一个过程啊,这也是没有问题的哈。呃,另外我们也是为了这个咱尽快的把这个内容说清楚,所以说呢我们是一周算三次,这个周一周二、周四、周六晚上哈。

20点到20点到22点。因为考虑到大家可能有有些人是已经工作哈。所以说如果是19点的话,有点早,所以就改到了20点到22点哈。😊,这么一个事情啊。呃,另外呢就是这个。现在这个大家有什么问题。

任何的问题啊,技术的、非技术的,我们可以来跟大家聊聊天哈。我们。还有一点点时间啊。呃。blue link说这些题对于面试算法算是难还是简单呢?之前面试算法题都比较基础的。

我个人觉得哈我们所跟大家所聊的这些面试题目算是呃。中等偏难的题目。就是如果是简单的啊,简单到就是说比方说呃就是。呃,就是刚才那个比方说我们说最最最最那个直接的问法,就是问你实现无bug的快速排序。

这个就是本身这种直接问法,咱就不会过多的去这个这个探讨了。但是当然快速排序的各种变化,我们会去强调的。比如说因为我们都知道快速排序的平均时间复杂度是N乘logN,它的最差时间复杂度是N方。

但是我们能不能设计一个。最差情况都是N乘log n的时间复杂度的快速排序算法呢,是可以的。如何去做。那么说快速排序这个算法本身它会利用它帮我们做哪些新的算法。

比如说我们从一个呃若干个数据里面去找top ten问题,前几名的问题,对吧?就可以用这个事情来做哈。所以一个算法,它背后的那些东西。我们那个。需要跟大家来探讨探讨这个事情哈。

所以这个是我们的这个一个很大的重点哈。呃,比方说我们在面试求习班里面可能不会跟大家讲这个冒泡排序怎么做。因为我觉得这个东西大家自己看一下就够了。对吧可能半小时大家就看懂了,陌慢排序哈。

所以咱只会谈那默慢排序怎么样做改进呢?改进之后他会得到什么情况呢?对吧?邻居之间他们之间只是交换的。那么说我们如果把它扩展视野呢,对吧?呃,做一些这样子的一些事情哈。呃。

就是有朋友谈到这个基础差的问题哈,这个呃其实其实哈在。报班的这些朋友里面基础就是相对现在这个很有潜力的这些人是非常多的这是很正常的情况哈。就是我们现在是潜力股,没问题哈。这个经过很快的一个迭代。

能变成绩U股。对吧这个但但是我们需要两方的配合就是。我们把这个内容整理好,然后这个算是跟大家做一个交流哈。另外自己也需要把这个东西掌握起来,一定要多练多练习,这个才是这个。需要做的事情好。对吧。🤧嗯嗯。

是的哈,就是说简单的算法,它往往会挖出一些。大家不太注意的地方来嘣问你一下,你你对吧?这这是很烦,对吧?你比方说呃堆排序对吧?这种东西或者是一个简单的东西哈,表示出上问题。😡,呃,图散问题。

对吧给定N个数。N个整数吧,比方说哈简单起价N个整数,然你再给定一个某一个数,比方如100,你要找出这N个数里面两个数的和加起来等于100的那个那俩数有是谁,对吧?设计一个最快的算法。

就就类似于这种题目哈。这个题目算是一个呃。中等偏简单的我个人觉得哈这么一个题目哈,那关于它的比方说我要出ree sum问题呢,我要出个N some问题呢,对吧?有各种各样的变化。

就会产生各种各样的问题哈。嗯。面试官秀逼格的问题,这个很麻烦啊,对吧?你给他反修一下,对吧?我们经常会谈的KNP问题。😊,我们会想那个会谈到这个人,我们给他反反袖他一下,对吧?呃。

到时候我们再接再去说这个这个很有趣的一个话题哈。😊,就是我们在面试场上一定要注意的是就是呃。平等的去交流,就是把自己会的一定要说出来,对吧?然后这个很重要哈,其实一定要就是我如果这个题目没明白。

ok那我就这个跟他交流,问问他,哎,这个是不是这种情况啊,这个什候都把它交流清楚,然后再说啊,这个很很很重要啊,就是千万不要是这个题目。不太会就啥都不说,这就麻烦了哈。啥都不说。

就面试官只能认为你不懂这这个对吧?而这个过程其实需要慢慢的去练,就是我。因为有时候艺高人胆大,就你你这个。🤧懂得多哈,哪怕这个题目我现在不懂,我也敢于跟你交流。他有时候这样,对吧?

说不定交流交流就出来了,对吧?😡,OK哈,小倩的意思是KMP已经是完全掌握了,是吧?😊,没事,KNP我们会这个它是一个。我就是KMP哈本来是一个呃并不是那么重要的算法。

但是呢这几年面试上考偏P的越来越多了。呃,呃这个这种情况哈,所以在这个里面各种各种情况,那个他怎么求的PMP的各种变化是怎么回事?它里面会涉及哪些从它衍伸出来的题目。哎,我说一个比说哈。

然后给你个字符串。然后呢,你能够计算一下这个字符串的比方说,我给你ABCABCABCABC这么字母串哈。显然ABC是这个字符串的一个。最小的一个周期对不对啊?你能够去求给定一个字符串的最小的这个周期吗?

对吧?你把这个给定字符串的最小的周期这个串给反回出来。这个哈是存在ON时间复杂度算法的,用的其实是KMP的一个引申哈。当然大家知道就好了哈,那有趣的东西咱这这个还很有趣的一个题目,对不对?

ON时间回来就找到它的这个最小周期圈啊。其实是用那个数字算。面试求职班会讲什么题难度的题太难了,估计面试一般的公司用不上。另外,视频提过吗?时间不稳定哦,这样啊就是说面试求职班。

咱的呃题目的难度系数是低于咱的呃算法班的。算法班的题目那个相对而言哈,可能呃就是相对而言哈,比方说笔面的90班要略难一点。比方说我们。面那个上班里面我们会讲这个数读问题,跟那个数读。

你怎么样去把它解出来啊,对吧?呃,我们会讲马太奇盘问题,然后面试求职班里面顶多顶多讲到8卦后问题哈。对吧这样一个难度哈,因为我们目的不是为了这个呃就是秀算法的对吧?我们是为了面试的。

就是为了实际中我们就就是大多数公司去要求什么,我们就学这一块就够了,对吧?因为他怎么说呢?目的性比较强啊,这个办法。呃,另外这个我们会在这个呃视频会会提供大家哈。

就是大家这个在那个我们会有一个这个每个人有一个账号,然后这个自己登录上去就能够这个。观看我们的这个相应的这个视频就好了,这个是没有问题的。所以这个如果是在20点到22点不太方便去上课的。

当然是可以事后看视频的,这个没问题哈。但是我个人建议大家最好能够是跟直播。因为直播的时候,大家得这个因为我们根据这个以往的经验哈,大家在直播的这个时候啊,第一学的快。第二呢他有那个直观的感觉。

就是有问题直接问。因为也是这么一个场景,大家就自由提问。然后呢,我看到这些问题会随会这个跟大家解释的,所以哈我们说的是两个小时。所以大家如果是离公交站比较远,地铁比较远的时候,可能大家需要自己琢磨琢磨。

或许会有一些拖堂哈。或许会有些脱堂。呃,这个这个我尽快尽量的不会拖堂啊,就是咱真正上课的时候,但是这个难说。🤧嗯。呃,我觉得哈在咱的算法外哈呃,我可能也是。见的东西也比较少啊。

可能是我觉得我我们的算法班算是咱全网一个。呃。🤢,相当好的一个这个算法的内容了哈,就是我们现在是冲着把算法打成个精品班去做的哈。我们现在已经是这么来去认为的了。然后呃所以我觉得掌握了算法班呃的内容之后。

再去做其他的关于呃算法的那些不管是面试笔试还是认证也好。我个人觉得。应该是。问题不是大问不是什么大问题的哈,我个人是这么来去看待这个事情的哈。因为我们上面来讲的内容其实呃涵盖的点是。够了的。

然后那个每一个地方都是做详细来阐述的哈。比方说数对吧?数嗯我们从那个查找排序这种简单的这种搜索数,然后到这个平方差数R数,这个红黑数234的数,然后这个甚至于三倍的R数,甚至各种情况啊。

其实我们都是做了详细的这个分解的。看一下这两个小时哈,其实内容上我我我我觉得哈这不是自己那什么,我觉得还是内容上还是够的哈。呃,机器学习班不是以三方方为基础的这是两个不同的方向哈。呃。

面试求职班跟那个积极学习机体学习班完全不一样的两个东西。就是说我们没必要去学了算法,再去学机器学习,这是完全没必要的哈。机器学习班里面,我们大概是分前面的3到4次课。

以数学的机器学习的角度来就重新的看待数学。比如说我们重新看待一下这个极大自然估计,我们重新来看待一下我们这里边那些求导到底怎么回事。它到底跟我们有什么关系。比如说C等于A乘以B这么一个矩阵的乘法。

它到底背后蕴含着什么东西,对吧?它跟马尔克模型是不是有什么样的相关性啊,甚至跟引马模型有什么关系,我们会重新做这么个操作,然后呢再去每一次课来分享一个基本的一个,比如说我们讲老师的回归啊。

下次讲这个呃聚类啊,再讲一个谱聚类,讲一个bo呀,讲个随机森林啊,讲个决策数,对吧?讲个SOM,然后再往下讲一个EM算法,讲一个贝斯网络,讲引马模型,讲LDA讲主机模型,对吧?变分这个采样。呃。

调节水场等等等等过程哈,它是跟我们的这个算法班是呃相对独立的,没有什么更更多的那个内容哈。只不过算法好了,你做机器学习,它方便一点。比如说咱以马无用为例啊,以马模型里面有一个叫维特比算法。

是做这个给定观测数据,计算它的引变量,它的这个最大的那个序列的这个东西本质上是个动态规划。对吧只是这样一个东西哈。😊,呃。呃,昆问这一年有多少个班这个。这个得交互室看,我们大概做了个计划哈。

呃我具体数据还真忘了。就是我们大概会比方说面试求职班、算法班这么一个东西,大概是十0次课的内容。继学一般大概是2次课的内容。然后我们会开一个深度学习,大概是1次左右哈,然后。专门做深度学习的一个班哈。

所以说大概就是这样一些内容去跟大家做分享哈。只不过每一次根据大家的这个呃就是互动的情况哈,比方上课的这个大家的问题啊,我的这个就是我们之间的变化哈,会每一次会有一些迭代,就是我们增加一些。

更适合一些的内容而已哈。所以最近就是3月的面试求职,4月的积极学习,5月的深圳学习班这么三个班次哈。呃,另外呢就是大家可以配合这个下载一下我们的这主来APP点com这个网站里面呢。

我们那个企月题库的app,然后这个以我们对每一个题目都做了一个解析哈,就是除了答案,还有解析,然后大家也可以这个。大家来看一下这个里面的题目本身哈,我们配合着我们的这个算法课是配合东西。

然后做一点更多的事情哈。呃,这样哈就是呃本来我们是三人报名或者发微博的话是8折。呃,刚才祖赖这个给的消息说,咱今天就是单人报名就8折哈,就不用这个我们在三人组队或者是什么事情了哈。只有今天。

一天的情况哈。以后咱就恢复了哈,今天是单单任报名8折的,就是积极学习班和这个面试求职班和积体学习班哈。呃,算法班会不会讲他的系统等算法之外的东西,毕竟面试也不只是算法啊,是这样。

面试求职班里面我们不会涉及到操作系统的内容。也不会涉及到数据库更多的内容。这个呃它涉及内容就太多了,比操作系统、数据库和网络这三个握手,我们就不会讲哈。嗯,但是呃比方说我们不会讲操作系统。

但是我们会讲关他有关的内容。比如说这里边我们一个假定说有一个这种比方说假定说我们做个案例哈,比方说有一个单进程了一个那个一个系统,它里面有若干的CPU若干的内存。我们现在有若干的任务。

如何安排这么一个任务,能够使得这些东西能够正常的运用下去,对吧?这种题目会讲哈,但是它本身其实不是操作系统,它其实是算了,对吧?我们我们我们只是这样一个思路去讲这个面试求职哈。

因为但是呢我们的那个企业机构app里面哈,其实是对那个内容做了一个分类的,就是这是算法的,这是语言的这是。网络的操作系统的编译的对吧?等等等等东西啊,这是这个移动开发的。这些东西哈这这这个是有的哈。

假说我们这里面不会讲安卓,对吧?不会讲按照开发这种东西。OK哈,那如果是呃大还有问题吗?😊,ok哈,那这样我们那个。😊,非常感谢大家能够这个这个这个今天。这个这个这个大周末的哈。

这个听我这个白货这么长时间的这个东西哈,然后也感谢大家能够。😊,我们在里面讲的哪些不对的,给出一个你的这个批评的建议啊,这个我们非常需要非常这个。诚恳的这个这个这个希望能够有更多的互动。

更多的这个相互的交流哈。好了哈,那这样我们今天的这个内容就先进行到这里哈。然后咱那个如果是有更多的问题跟话题,我们就在我们的这个社区也给我们的各自的这个微博跟那个公众号里边公众做更多的探讨啊。

人工智能—面试求职公开课(七月在线出品) - P12:字符串高频面试题精讲 - 七月在线-julyedu - BV1Xf4y1r74s

🎼,大家好,欢迎观看7月算法公开课。我们本堂课的主要内容是字符串高频面试题精讲。我将从如下几个方面讲述本课。首先讲一下字符串方面的简介,然后总结一下近年来字符串相关的面试题的总体思路。

做一个知识点的梳理。接下来讲五个例题,最后总结结束本课。关于字符串方面的简介,英文是str,我们通常把字符串作为字符数组来对待java里面str是内置类型,注意这里面S是大写的,它是不可以更改的类。

要更改的话,考虑使用str bufferfferstr builder之类的类,也可以用它内置的to chair error的方法,把str转化成字符数组再进行操作。

那C加加本身自带的STD内库里面也有str这么一个类。它是可更改的字符串。😊,当然,我们也可以直接使用chair数组。在这里面使用str和ch数组本身在使用上差别不是很大,因为它可以更改。

我们可以通过使用中括号来直接取str里面的某一个字符的位置来直接更改它,所以在操作起来str和这个ch数组差别不大。C没有什么好说的,只有字符数组,因为它没有str类。值得注意的是有如下三点。

第一点是C加加里面关于字符连接符号,也就是加号这个运算符它的操作的复杂度。这个帮助文档说是未定义的。但我们通常认为它是线性的。所以我们在for循环里面有这个str的加法的时候。

要特别注意它的复杂度很有可能退化成N方的。比方说我们想建立一个从A到Z这么一个字符串。如果我们不断的使用这个字符串加法,先加上一个A,再加上一个B一个一个加上去的话,复杂度是26的平方的级别的。

如果我们用一个ch数组,先把第一位复成A,第二位复成B,如此下去的话,复杂度只有26这种级别。所以在使用字符串连接符的时候,它的复杂度我们需要特别注意。第二个是说C加加里面呃str类的自带的这个方法。

substr。😊,就是SUBSTR这个函数,它有一种形式是有两个参数。第一个参数是字符串的起点。第二个参数不是终点,而是长度。它的含义是我们从这个起点开始截取一定的长度的字符串作为子串。

所以它这个呃和其他的函数都不太一样。一般的字符串函数都是呃给一个起点,给一个终点截一个从起点到终点的这个字符串的长度。😊,所以这个。就这里面C加加的这个函数和其他的函数不一样。

java里面也有类似的sub string,它截取的就是从起点到终点。注意我这里面从起点到终点的意思是包括起点,而不包括终点的,也就是左臂右开区间的这么一个子串,这个看似相似的两个函数在它的表现形式上。

以及最终的运行结果上都是完全不一样的,有着不同的行为的定义。😊,那第三个值得注意的就是字符范围。因为C是和平台相关的。我们通常认为一个chair的大小是8位的,也就是-128到正127。

当然我们可以把它转化为ign的,也就是无符号的,就变成了0到255,这个是阿斯克玛的这个区间范围。对java来讲,它是平台无关的,并且它是unicode的编码的。所以它一个ch是16位的。

所以它比C和C加加的ch要宽,它的范围就是0到6535。我提这个的一个目的就是当我们想统计一个字符串中每种字符出现的次数的时候,我们通常不会用一个哈奇函数来做,我们直接把这个ch作为一个数组的下标。

我们直接统计每种字符出现了多少次。最后打出的是一张每个字符出现多少次的这么一张表。所以这张表我们需要有一个足够大的数组来存。那对于C和C加加来讲,我们通常只要开到25。😊,有数组就够了。java来讲。

我们需要开到6536,所以这点要特别注意。第二个呢就是对字符串的面试题的总体上的分析。首先字符串和数组是非常相关的,涉及到数组的题目都可以变化成设及成字符串的样子。所以因为数组应用非常广泛。

所以字符串的面试题也非常多,有一个重要的概念上的理解就是字典序字典序简单的来说,就是在英文字典里面,两个字符串,哪个排在前面,哪个字典序就小。我们通常可以把它扩展到整数类型的数组。

比方说两个int数组哪个字典序小。我们可以用类似的方式来判断。就是先比较第一个哪个小字典序就小,相同的话,再比较第二个如此下去,直到笔出字典序或者两个字典序相同。😊,当然如果前面一直相同的话。

较短的字典序小,这个是关于字典序的概念,它实际上是一个抽象的意义上的顺序的这种意思。另外就是关于题目,题目大概分了这么几类。第一类呢就是简单的操作,包括插入一个字符啊,删除一些字符啊,修改一些字符。

包括字符串旋转呃,通俗的说就是给一些操作,在字符串上做一些折腾。第二个呢是规则上的判断,就是给定一系列规则,让你判断这个字符串是否合法,比方说罗马数字和阿拉伯数字的转换。

然后判断一个字符串是否是一个合法的整数,这个就是C语言里面的A toI,我们需要考虑呢正负号非法字符呃,包括这个空白怎么处理等等。如果它合法的话,我们需要返回它表示的这个int值,非法的话。

我们有自己的处理方式,还有类似的浮点数,同样考虑小数点位置,考虑正负号,考虑空白,考虑科学技数法的表示是否正确等等。这一类也是一个比较大的类别。下面就是数字运算,在计算机里面字长是有限的。

所以我们想表示的整。😊,数的范围也是有限的啊,当然java里面有big integer。如果不允许用big integer,我们要实现大数的这种运算的话,一个常用的策略就是用这个字符串来模拟。嗯。

我们可以模拟成百上千位的这种大数的加法减法,甚至乘除这种运算。一个典型的题目就是二进制加法。它的输入就是两个01串。表示二进制,然后我们输出就是这两个串的和,输出也用二进制零1串来表示。

这个是一个典型的题目。在后面的类别呢就是排序交换,这个是和数组相关的。一个比较典型的过程,就是快速排序里面的排提ition过程,就是把比分区元素小的,放到一边,比分区元素大的,放到另一边。

这个是呃涉及到呃排序交换的一大类别。下面一大类别就是字符计数。刚才说了,我们通常不会自己写哈希函数,而是直接把这个字符放到数组下标里面,统计一下字符串的大小。每种字符出现的类别。那么。😊。

一个应用就是变位词,所谓变位词就是组成字母完全相同的词。比方说ABC和AB还有BAC等等,他们都是变位词。判断变位词非常简单,两种方法,第一种就是把这个字符串里面的字符,按照由小到大排下序ABC也好。

BC也好,CAB也好,最后排完了都是ABC那另外一种方法就是用到了字符的这种计数,比方说ABC就是一个A1个B1个CCBA这些都是一个A1个B1个C,所以它们是相同的。

后面会有一个例题涉及到了字符计数以及滑动窗口,请大家仔细考虑。在下面有一个比较大的类别,就是匹配这类问题呃通常不是很难有着固定的套路。比方说正则表达式匹配。这种表达式带有一些通配符,比方说点问号星号等。

这种通常是通过递归来匹配,还有全串匹配,或者叫子串匹配就是。😊,最简单的从一个串里面找到另外一个串是否出现。那么它最直接的解决方法就是呃暴力解决。当然,KMP是一个典型的串匹配的算法。

然后KMP还有另外一个应用,就是判断这个串是不是周期的。比方说如果一个串反复的出现ABCABCABC这样的串,它实际上是一个周期串。我们通过nex数组的性质,可以判断这个串到底是不是周期串。

这是一个比较大的类别。😊,另外一类就是动态规划。因为字符串本身就是数组嘛,我们动态规划有着经典的LRCS。😊,这个就是最长公共子序列,也可以说最长公共子串,我们都可以做。注意子序列是不连续的。

子串必须要连续。然后编辑距离编辑距离本身就定义在这个字符串,把一个变为另一个的最短操作数上,所以它也是字符串上的一个动态规划。还有一个就是最长回文子串,它有两个算法,一个就是朴素的动态规划算法。

还有一个是一个线性的最长回文子串算法,它们都是动态规划的一个典型应用。😊,我也把它作为一个大类别。最后一个就是搜索。因为字符串本身就是数组嘛,我们可以从N个元素中选M个元素做一下全排列。

也可以从N个元素中选M个元元素做一个组合。所以把它作为一个搜索。另外我讲了一个在BFS里面讲了一个单词变换的题目,它也是一个传统意义上的搜索题目。😊,下面是正式的例题。第一个例题。

我举它的目的是啊它是我最近看到的一个在线的笔试题。呃,它虽然比较简单,但是体现了对快排partition这个过程的理解。比方说啊把一个01串,也就是只包含零和一的串进行排序。你可以所做的操作。

只有对任何两个位置做一次交换。那问至少交换多少次才能把它排好序。显然排好顺序是呃零在左边一在右边这么一连串的01。😊,那熟悉快排的同学可能直接就会想到parttiition这个过程。

其实它就是这么一个过程。我们最左边的零和最右边的一是没有意义的,因为他们永远不会被交换,因为最后排好顺序也是这个样子。我们从左往右扫第一个一的位置,从右往左扫第一个为零的位置,扫到了我们就做交换。

然后继续扫就可以了。那这里面代码大家可以理解为伪代码,因为呃这个空间的关系可能这个风格不是很好,比方说分号没有空格啊,这个if服后面没有换行等等。但是呃是一个思路的体现。😊,啊。

answer就是我们要最终交换的最少次数,我们I从左到右扫J从右往左扫,始终考虑I小于J。那么如果AI等于0,也就是从左往右扫始终是零的话,我们就不断的加,从右往左扫始终是一的话,我们就不断的减。

如果这个时候I还小于J的话,就说明我们找到了一个左面的一和右面的零,我们把它们直接进行交换就可以了。这里我们当然没有必要真的进行交换,我们只需要记录一下交换的次数。交换之后,I加一J减1。

这就是一个partition过程,再强调一下它的线性的这个复杂度的这个推导。因为I始终在增加I从来没有被减小过,J始终在减小J没有被增加过I和J一共最多也就经历了Lance这么长。

所以它是一个线性的O lens的这么一个复杂度。所以分析复杂度不是简单的看有几个循环就可以了。尽管它有三个循环,它的时间复杂度是线性的。😊,这个是我对第一个例题的这么一个陈述。

那第二个例题是字符的替换和复制。就是给定一个字符串,我们要删除其中所有的A,并且复制其中所有的B。这里面有一个提示是说字符串这个数组是足够大的。言外之一就是我们的返回是用同一段空间保存这个字符串。

我们没有必要再新开辟空间,也没有必要再新的用另外一个字符串来表示结果,我们还用这个字符串。首先删除A比较简单。😊,我们直接看一下,如果不是A,我们就把它复过来,这样就把所有的A都删掉了。

因为这个N的增长比I的增长始终要慢一些。所以我们用N就是S本身这个N来表示这个就是新的S和旧的S都用同一个值是没有关系的。因为我们这个S的这个数组始终不会覆盖我们就是想要的那些值,因为N增长比较慢。

所以这步做完之后,这个S是把所有A都删掉的。这个新的S了。我们用的还是同一块空间。😊,然后呢,我在这里面统计了一下B出现了多少次,也就是nbe词,这个顺便统计了一下。

这是一个线性的这个删除A还是比较容易理解的。关键我们考虑如何复制所有的B复制所有的B有一个问题。比方说删除A之后,字符串变成了BC。我要复制第一个B,那么我会把C也覆盖掉,因为复制之后,C变成B了。

这显然不是我们想要的。那如果我还想保留这个C在复制B之前,我需要把C往右移一下,这样就有了一个类似于插入排序的这么一个过程。我每当要复制一个B的时候,我就要把B后面的这些字符都向右移动一下。

然后留出一个空位,把B填到这个空位,这是一个显然可行的方法。但是它的时间复杂度是N的平方的。😊,那我们有没有办法?在ON时间内完成这个复制B的操作呢,其实我们可以考虑倒着复制。我们来看一下怎么复制。

首先,新的字符串的长度就是N加nB,因为字符串长度是N,其中有这么多个B,每个B都要复制一下,所以新的长度就是N加numbB。所以我们知道新的长度,我们就知道新的最后一个位置的位置。

就是最后一个字符的位置就是I。那旧的最后一个字符的位置就是J,我们就一位一位把它复制过来。然后发现如果是B的话,我们就再多复制一个B就好了。😊,正是因为我们倒着复制,大概大家可以在纸上画一下。

就是因为倒着复制才会导致我们这个呃被覆盖的这些这些字符和这个旧的字符是没有重叠的。所以我们保证了原始的那些信息的正确性,所以不会有我们想要的那些信息被覆盖掉。😊,这个是一个倒着复制的经典策略。

其实在C本身的这种函数有一个函数叫做呃memory copy。它在实现呃有重叠区域的复制的时候,它采取的就是这种倒着复制的策略。所以它是一个经典思想的一个应用。😊,也是我举这个例题的一个目的。

给大家一个思考题,就是如何把一个字符串里面的空格变成20%。这里面20%并不是十进制的20,它是呃十六进制20其实是32。它是这个空格的阿克码。在网络传说中。

我们通常把一个字符串里面的所有空格转化成20%。这里同样字符数组足够大。请大家思考这个怎么做,其实也是倒着做一下,把空格的位置算出来,把新的长度算好,然后把空格变成02百分号就可以了。

所以这个倒着复制是一个经典的应用,我们来看一下第三题。😊,第三题其实是前两题的这么一个综合,它既有partition的过程,也有倒着复制的过程。我们来看一下,给定一个字符串只包含信号和数字。😊。

然后我们要求做一些变换,把星号放到开头,数字放到后面。当然这些数字不能变。我们可以考虑采取快排的爬itionition的方法。宽排partition的理解就是我们可以用循环步辨试来理解它。

所谓循环步面试就是一些布尔的条件。它在循环之前是成立的,然后在每一步循环保证它也是成立的。那么我们会知道它在循环之后也是成立的,这个证明类似于数学归纳法,因为每一步它都是成立的。😊。

那我们的循环不变式是0到I减一这个区间全是星号,I到J减一这个区间全是数字,这到N减一的区间全都是没有探测的字符。那么我们初始条件,I等于0,J等于0。那0到I减1实际上是零到-1,这是一个空的区间。

对于空的区间,我说它是什么都是正确的,所以这个是成立的。I到J减一是一样的,也是0到-一也是空区间,我说它是数字也是可以的那后面J到N减1是未探测,这是0,J到N减一的意思就是整个字符串。

我都是没有处理过的,这也是正确的。我们考虑。😊,对,每一个J为什么它也是正确的。因为当这是这个星号的时候,这是数字的时候,略过去,这是星号的时候,我们看一下它怎么做。我们把I和这做一下交换。

注意I实际上是最后一个星号和第一个数字的这个分界点,可以理解为它是第一个数字的位置。我们把第一个数字的位置和星号的位置,做一下交换,这样就把第一个数字其实变成了最后一个星号。

星号的区间就往右扩展了一数字的这个区间也往右扩展了。一我们下面通过一个例子来看一下为什么这个循环不变是是一直成立的。😊,我举的例子是星号01星号2、星号4。我们看一下最开始I等于0,J等于0。

原则就是遇到星号,就SJ和SI做一下交换。显然最开始是个星号,那么S0和SS0本身做交换交换完了之后,这个字符串是不变的。不变之后,I等于一。我们注意I的左边始终是星号。

因为这时候I等于一这个零的位置是星号。😊,字符串虽然是没有变化的。然后呢,这这增加一之后,这变成一这一的位置是数字零不变,这等于2数字一也不变。这等于3,我们发现又是星号,继续S1和S3做交换。

就把这个星号和这个零做了交换。这样开头是两个星号,然后变成了这个样子,并且I增加一变成2。我们注意R的左边是两个星号,所以I的左边始终是星号,I指向的是第一个数字的位置。

再继续这等于4就变成了这个二的位置,因为是数字,所以不变,这等于5,我们同样把S2和S5做交换,把这个星号和这个一做交换,就变成了这个样子,最后I等于3,注意I等于三的时候,呃,指向的是零这个位置。

它左边有三个星号,所以又一次印证了I的左边全是星号这个问题。😊,再往后,虽然J还在变化,但是它指向的都是数字,不会涉及到交换。所以这个字符号也没有任何变化了。

最终我们达到了信号在前面数字在后面的这么一个过程。😊,这个采取的就是交换的方法,维护了循环不变式,这是一个petition的经典应用。它有一个特点吧,就是说。数字的位置改变了,原来数字是0124。

现在数字是0214。所以数字的相对位置改变了,我们看一下有没有办法不改变数字的相对位置,达到同样的效果。😊,这就要用到我刚才讲的倒着复制的策略。我们把J也从N减一倒这来,我们倒着看一下SI是不是数字。

如果SI是数字,我就要它不是数字,不是数字就是星号,不是数字,我就暂时先不理它。这样的话呃,这 is的就是C的内置的一个函数,是判断SI是不是数字的,是就是一,不是就是零。如果是数字。

我就要它不是数字的话,我暂时没有理它。这样最后I是负一,I,最后显然是负一,I是负一的时候,J有可能还没有变成负一。那么我们看一下没有变成负一的那些位置,显然是因为多出来了那么多星号。

我们把开头复成星号就可以了。所以这个是一个变相的,倒着复制,它没有改变数字的位置。😊,所以它实际上是例一和例二的这么一个结合,既体现了一个petition的方法,又体现了一个这个倒着复制的方法。啊。

另外举这个例子的一个目的是说,在面试的时候,如果遇到这个题,我们可以问一下要不要改变这个数字的顺序。另外一点,如果不改变数字的顺序,我们只能使用这种方法。

因为快速排序的partition是所谓的不stabletable的就是不稳定的排序,它会改变那些数字的顺序。另外一点是说,如果。😊,题目要求我们只能通过交换来完成这个任务的话。

我们只能选用那个partition的办法。因为只有那个方法是通过交换的。这个方法二只是做了一些这个字符的平移,并没有真正的那个交换的过程。所以这是两个方法,各自的特点。那第四题就是子串的变位词。

举这个例子是想体现这个滑动窗口的思想。另外一个是体现统计字符个数字符种类的这么一个思想。它也是我最近看到的一个公司的最新的面试题,所以有一定的新颖性。嗯。

它题目是说给定两个串A和B问B是不是A的一个子串的变位词?变位词的定义。我们刚才讲过呃,举几个例子,比方说A是hello,那B呢比方说是LEL,这个是个 true,为什么呢?因为A有一个子串是ELL。

它和LEL是变位词,那B是LE,那这也是te,因为A还是这个子串ELL那如果B是ELLOA也有EO这个也是t。但是呢如果B是ELO。😊,这个就不是出了。

因为这个子串必须是连续的A没有一个子串由ELO这三个字符来构成。所以这个就是forrsce,屏目意思就是这样。我们的思想呢其实就是一个滑动窗口的思想。我们动态维护一个窗口,这个窗口在A上开。

假设B的长度是3,这个B的长度是4的,暂时不考虑了。那个思路是一样的。假设B的长度是3。我们看一下A开一个长度为3的窗口就是0到21到32到4。

也就是HELELR和LRO我们需要看这个每个窗口和B是不是一样。或者说每个窗口和B的这些字母是不是完全一样。如果完全一样,它显然就是一个编尾词的子串。关键就是问题是我们这个窗口在不断的往前滑,每划一次。

我得到的这个子串和B要比较一次所有的字符是否相等,我们有没有更简单更快捷的方式呢?思路还是这样。😊,那,刚才说了,我们可以用哈希的方法。😊,当然我们可以用字符的全部的类别。比方说C刚才讲到了。

用0到255,那java呢用0到6535的数组,我们用这么一个这么大的数组是可以的。我们同样可以暂且认为我们的输入字符串全都是小写的英文字母。

这样呢我们就用0到2526个这个位置来表示这26种字母就好了。我们看一下每个字母,也就是每个单词,这里每个单词是字母的意思出现多少次。我们来看一下。😊。

就是这一个循环BI减A就是把B里面的DI位变成了0到25中间的一个数。这是一个就是把字母和数字做成映射的这么一种惯用的方法。当然我统计了另外一个变量,叫做numbze。

就表示nm这个数组里面有多少个值是非零的那显然如果它加上之后等于一的话,说明之前是零,那么n zeroro加一这个循环做完之后。

最终达到的效果就是numb数组表示每个单词每个字母或者说每个单词出现了多少次。nzero表示这个0到25里面有多少个位置是非零的。这个值对我们来讲以后至关重要。

目前这个name的含义是B里面的所有信息都在numb里面了。我们来看一下怎么把A里面的信息也加进来。😊,我们我们的意思是说,看一下A中。每个窗口里面的字符种类,然后用B里面对应的次数减一下。

所以在减完之后,这个name么的含义变成了。每个字母。在B中出现的次数和在A中出现次数的差值。所以这个那么不光有了B的信息,也有A的信息,它存的是同一个字母,在两个。字符串里面出现的次数的差。

当然这里面A是取了一个窗口,B是取了全部的这个B字符串的全部内容。那么我们看一下第一个窗口啊,首先这里面提一下,如果lenance A比lenance B还小的话,显然是无解的。因为这个B是A的子串。

所以B的长度要小于等于A。如果B的长度大于A就没有解了。所以A我们可以截取一个第一个lance b的窗口,也就是从开头截这么长。😊,刚才说了,我要统计一下出现字符的每种字符的这个个数的差。那对A来讲。

同样我把一个位置变成0到25之间。然后刚才是B中出现次数,现在是A种,所以我要减一下,因为要算差。然后如果它等于0,我同样维护这个nzero。如果它等于零,说明原来是一,我把一个非零值。😊,变成了0。

所以非零值个数少了一。当然如果它是负一的话,说明人家原来是零,我把它变成了负一,我就把一个零值变成了非零值。

所以我在这里面namem就是呃字符串中每种字符个数的差和这个其中有多少个值非零可以同时的动态维护。😊,这样下来之后就是A的第一个窗口,就是A开头到lesssB减一这么长的这个。这个串和B是不是变位词呢?

我们就看一下nzero是不是0。因为如果那么里面全是零,这就证明了A里面的那个窗口的字符和B里面的那个字符都一样了。因为这个里面存的是差,如果不是零,就说明有正值,有负值。那显然这两个就不是变位词。

那这个第一个窗口就判断完了。关键我们看一下这个窗口是如何滑动的。😊,我们看一下。新的窗口是假设以I结尾,那么它的起点是I减LsB加一,那旧的窗口呢是以I减一结尾起点是I减Lsb。

所以是旧窗口向右移动一位变成了新窗口,它们中间那些位置其实是一样的,只是这个旧窗口的第一位扔掉了,就把AI减lansb扔掉。那把AI加进来,这是新窗口的最后一位,它是新的旧窗口里面没有的。

那我们怎么体现这个呃name中怎么扔掉AI减 lenssb怎么加入AI呢?一样的,我们先把这个C算出来,这个C还是0到25之间的这么一个这个是I减lan B,我们怎么把它扔掉呢?原来怎么做呢?

我们返回去就好了。因为我们原来是把这位减掉的?我要扔掉它的话,显然在那中把这位加上就好了。同样维护一下n zeroro的个数。因为如果它是一的话,说明它原来是零,我们把一个零变成了非零。

那如果它人原来是负一的话。😊,我们就把一个非零变成了0,这个同样是维护nzero的个数。我们怎么把AI加进来呢?一样的。😊,因为算的是个数差,加进一个字符,其实就把这个位减一就可以了。

同样维护一下nzero的个数。然后看一下,如果ninezero是0,就说明两个变位词是一样的了。那么它就是t这个I每移动一位就代表了这个窗口的,就是窗口的最后一位,也就是右端点向右移动了一位。

所以这个就是窗口向右滑动一位的过程。我们可以看一下这个算法的复杂度就是ON的,就是每移动一次,它是O一的,整个移动了N次,它的这个复杂度是ON的。

所以这个我们没有任何哈西操作完全是用的这个数组之间的这种加加减减的操作,就动态维护了这么一个滑动窗口的过程,解决了这个变位词的问题。😊,然后给大家留个思考题,就是lead code上第三题。

它求的是呃最大的这么一个窗口,窗口里面的字符没有重样的,也就是每个字符只出现一次最长的这么一个窗口,求这个窗口的长度,我们一样可以用类似的方法来解决。😊,那第五题其实就是呃翻转句子中的单词单词内容不变。

举个例子就是Im a student,我们翻转的时候变成了student a am,就是最后一个单词变到了第一个倒数第二个单词变变到了正数第二个。但是每个单词内部的字母顺序是没有变化的。😊。

我们用到的一个工具的函数,非常简单的函数就是我们把一个呃字符串从DI位到DJ位进行翻转的这么一个操作。其实就是如果I小于J,就把这两个位置交换,然后并且I加一J减1。如果指针I和指针J碰上了,就不做了。

相当于我以中心点为对称轴把这个从DI位到DJ位这段进行交换。我们用这个函数作为一个工具,显然这个函数的时间复杂度是线性的。因为只有一重循环,那这个东西有什么用呢?

我们看一下我们把I啊传给这个零把J传整个句子的长度减1,也就是我们把整个句子可以翻转掉。那这个例子,I'm student就转换成这样了,这样了,是吧。😊,每个字符都倒过来了。啊。

现在要呃这和我们要的不一样,我们看一下,再把每个单词单独翻转。😊,student翻转就成这个样子,呃是这样M翻回来,所以翻转两次就。😊,达到了我们想要的结果。第一次是对整个句子做一下翻转。

第二次是对每个单词做一下翻转。显然这个时间复杂度是线性的那它的难点在哪呢?难点在于,首先想到这个算法,第二个难点在于我们如何找到每个单词。因为对整个句子翻转是简单的。空格该该翻了也就翻了。

我们要找到单词的界限。其实它考的是一个隐性的这么一个split一个过程,就是我们要找到空格的位置,然后空格之间,我们认为是个单词,把这个界限确定好,通俗的说就是把这个I和J确定好,我们传一个IG过去。

它就翻一个单词,最后就达到我们想要的结果。😊,那我们再看一个思考题,就是字符串循环移位,这个也是一个比较常见的题。比方说ABCD。😊,我移动一次就变成了BCDA就把第一位放到后面去了。

移动两位就变成了CDAB就把B又放到后面去了,移动三位就变成了这个样子,移动4位又回到了ABCD。所以一个结论,一个显然的结论就是长度为N的字符我如果移动M次的话,其实相当于移动了M对N取一次。

再多移动其实没有意义。因为它最多只能移出这4种样子来。因为它是循环的转着圈移动的那。😊,这个是怎么实现呢?如果我想移动M次的话,怎么实现呢?我们先对前M位翻转,这里假设M小于N,所以取余不取域是一样的。

我们先对前M翻转,再对后N减M位翻转。😊,就可以达到。一个目的就总体再翻转一次就可以达到我们这个题的目的。我们看一下对这个前M位和后N减MV翻转达到一个什么效果。比方说我想对它移动两次。

我对前两位翻转就变成了BA。😊,我对后两位翻转就变成了DC,所以这个串就变成了BADC它恰好是这个串的一个倒序BADC所以我对总总体再翻转一下,就达到了我想要的CDAB所以这个也是一个呃翻转两次的过程。

这个举这个例子,一个目的就是我们使用了如此简单的一个翻转的这么一个函数,就是给定I给定J,我们把它翻转使用这个函数,经过翻转两次的这种操作,我们可以达到循环移位的目的。

我们也可以达到翻转每个单词的这么一个目的。所以这个是举这个呃例题的一个目的吧。因为这个也是比较经典的一个面试题。那下面我做一下总结。首先是我对inplace的理解inplace其实啊中文是原地。

通常我们说一个东西是原地的,是指它使用了O一的空间,其实我个人觉得没有那么简单,因为比方说我们说快排是inplacein place,为什么?因为它这个是在自己用自己数组的空间进行排序。

没有用到额外的这种空间。实际上它还用了额外对战的空间。但是我们在递归的时候,这个对战空间是不予考虑的。所以我理解inplace的这个含义不光是说常数空间,而是说我们用到的是输入自身的空间。

而没有考虑什么对战啊那些空间,所以这个inplace本身的含义比这个O一空间要松弛一些。只是我没有考虑这个对战啊这些东西。另外一个就是原地相关的这些问题。刚才我提到的就是字符串循环左移右移这是循环。

因为啊快排的partition,之前讲的那几个例题,涉及到partition。😊,都是in place的,因为它就是自身空间的交换完成的操作。另外一个比较重要的内容也是今天讲到的就是滑动窗口。😊。

这个它可以达到ON时间的复杂度,解决问题,解决这种类似于匹配的问题。因为窗口每滑动一次是O一的,整个滑下把字符串全都划过来,是达到了1个ON的时间复杂度。

那空间复杂度是O一的这个O一是指我们这个字符串的字母个数,这个字母种类个数是O1的,比方说刚才讲的C是256。呃,那个java是65536。😊,虽然这个开出来的数组可能还是很大。

比方说java要开到6万多,但是我们通常认为这是个常数,所以隐藏在这个O一背后的这个常数有的时候也是不容小视的。因因为这个要统计每种字符出现的次数。所以这个O一并不是我们想象的那种常数空间。

另外一个是今天没有讲到的就是规则相关的这种呃问题,比方说我刚才提到的A two I啊这个罗马数字和阿拉阿拉伯数字的转换,这些问题通常需要非常细致的这种这种编程能力,但是对算法本身要求并不是很高。

然后另外一个没有讲到的就是匹配。通常如果我们在面试笔试中遇到匹配的问题,其实暴力就可以解决。很少会考要求大家实现一个KMP这种匹配算法,尽管它很有用,但是很少让我们直接实现。

然后这个算法其实是刚才我提到的一个线性时间求最长回文子串的算法。本次课也没有设计。它也指出。😊,现在要求比较高的笔试上,因为很难让大家直接实现它。好,今天的课就到这里,希望大家给我提出批评指正。

谢谢大家。😊。

人工智能—面试求职公开课(七月在线出品) - P13:半小时掌握DP的基本套路 - 七月在线-julyedu - BV1Xf4y1r74s

嗯,今天要讲动态规划。大家在大学的时候算法课上,大家回忆一下,大学的时候算法课上老师有讲过动态规划这一章吗?我想做个调查吧,小调查。有人有听大学老师讲过动态规划这一章吗?或者你们在考试里有考过。

算法课的考试里。对的。就是我们也没有,大家觉得会不会觉得很奇怪,就是大学不讲。你平时也接接触不到,但是。公司面试的时候却考,大家不觉得这很奇怪吗?对不对?当然这不是老师没搞懂的问题啊。

老师想讲肯定是能搞得懂的这东西不难。我觉得动态规划真的是一件不难的东西。那为什么?老师不讲。考试也不考,但是公司面试的时候却要考你呢。其实。我觉得是。是这样的,就是说动态规划是一个。挺简单的东西。

但是呢公司为什么要考你呢?就是因为动态规划它的精髓是加缓存,动态规划的精髓真的就是加缓存。加缓存是我们在工作中经常碰到的东西,特别是你做线上的服务,或者你做大规模的一些服务的话。

大规模流量大大流量一些服务的话,缓存是必备的。就说没有缓存,你这个系统动动不了。所以其实动态规划的精髓就是加缓存。公司考你动态规划就是想考你会不会加缓存。

好。那大家有一个加缓存的概念之后,我们就来上今天的课。今天的课有一个前导技能,什么叫前导技能?前导技能就是说你必须会递归。这个课上周有老师讲过,不知道大家。呃,学的怎么样?就是一个是递归。

另一个就是基本的深度优先,就是那种回溯法、暴力搜索啊,这是必须会的。不会,今天的课听起来就会比较难过一些。当然这些东西也很简单嘛,所以必知必会的东西大家还是要掌握一下。那什么叫动态规划呢?

动态规划它又叫DP。是那个dynamicna programming。但是这个动态规划这个名字我从小我我很很早就开始学动态规划,当时就。没有想太明白,你想贪心法对吧?这个很直观,就是贪心搜索法,哎。

那就是搜索。回溯法,那它就是一个深度优优先,广度优先搜索bra叭一一堆的算法,包括比如说比较复杂的各种数。他就是树。各种图它就是图,比如说网络流,那它就是一个网络上面有流。

但是唯一一个名字最奇怪的就是动态规划。这动态规划的因为这个是历史原因啊,动态规划的来源它比较的。奇怪,然后发明的人也是随便起了一个名字,所以大家不要虽然叫他动态规划,但是不要特别的去在意他的名字。

因为这个名字真的不是特别的直观,跟其他的算法名字来比。我觉得他名字是没有意义的。虽然在这个应筹学里面好像也叫动态规划吧。那我们今天上课的目的。其实目的就是让大家可以。写出动态规划的代码。上完今天的课。

大家一定要能写得出动态规划的代码。无论这个代码优不优美。就必须能写的出来。ACAC指的是那个accept,就是在大家在li code上,如果通过了一道题,这道题通过了,它会返回给你一个提示。

叫accept。那跟AC相关的,还有什么呃WA啊,对吧?还有TRE啊这种大家要知道这些缩写。我们课程开始从呃198开始。就是li code198。呃,这题我是做过的。我看一下啊,我做的。把它删掉吧。

不要删全部就删就行。这个啥。我不知道大家都做了lead code的题目没有啊,我这边再讲一遍lea code上的一些注意事项。首先它会给你一个,我如果用的是java,假设我用的java,它会给你一个类。

然后类里面会有个方法。这个方法就是它传入数据的一个方法。比如说这道题它传入一个数组。就是一个这样的一个。function选,但是呢它有一个返回值,返回值就是你所需要的答案啊。

返回值就是他所需要你提供的答案。大家要注意它这个数组很有可能是0,啊,基本上每一个数据点里面都会有一个0。所以大家要特特别的判断说如果为零的话,你要返回零。然后如果不是零的话,我们就开始。

执行我们的解答过程。好。还看这道题。这道题的意思就是说。我题目大家就不要去读了,不要不要不要去读了,我跟直接跟大家说吧。我在一个一条街区上,一条街区上有N户人家。有恩护人家。

每户人家家里都有一定量的现金。然后呢,这个现金我是给你的,数量是给你的。然后有一个小偷沿接挨个偷。当最好的办法就是把所有人人家都偷一遍,对吧?所有人家都偷一遍。那。为什么不能这么做呢?是因为。

是因为它有个规则,就是说如果你连续偷两家,连续偷两家。那就会触发警报,他就不能再偷了,他就偷偷着这个任务就失败了,所以他不能连续投两家,你可以隔加偷。你也可以隔两家头。隔三架投都可以。

但是你就不能连续投两家。就问你小偷怎么偷才能偷到最最多的钱?大家对这个题目的题目意思有不理解的吗?这题目意思就非常的。非常的简单。这道题不算特别难啊,这道题的难度是ea性。我拿它当立题。

就是因为题目简单并且容易实现。那这道题。大家这后其他。😊,我今天讲动态规划的课,这道题可能用动态规划来写,但是。我想说的是,大家碰到这样的题目。你能第一反应是动态规划吗?因为面试官考你问题的时候。

或者大家在问遇到实际问题的时候,没有人会告诉你说,哎,这题就是用动态规划,你用动态规划给我解解一下,那这也太傻了,对吧?那这道题大家分析一下题目意思啊,一开始分析一下题目意思,题目意思是是什么呢?

就是我们要有一个策略,就是要输出一个策略。这个策略的含义就是。哪些家被偷了对吧?哪些家被偷了。然后有一个限制约束条件,这个约束条件就是。不能连着偷。这就是这道题。抽象以后就是我们要把题进行一个抽象。

抽象以后问你的一些东西。那。其实这个约束条件倒是无所谓的,为什么这么说呢?这个约束条件有可能他说隔两家不能投,那有可能下一回再考,你说呃,连连着只有连着三家不能投,连着两家还让你投,对吧?

这个都是随便问的那其实最重要的是什么?最重要的就是。你最后选择了偷哪几家?就是根据约束条件,你学最终选择了投哪哪几家。那。这不就是一个集合。一到N的一个集合,它的子集呢?对吧自己。

这道题在前面讲递归的时候应该有讲过,包括深度优先的时候也是讲过的。求一个集合的所有子集。用什么什么办法?有人回答一下吗?求一个集合的所有字己用的是什么办法?对,DFS。

所以这道题大家的第一个反应应该是DFS才才对。如果你跟我说,你第一反应这个动态规划,我真的是没话说。你是个老司机。那我们就用DF来做一下这道题。大家看啊DFS第一步是什么?定义你的搜索过程。

我们的搜索过程,我喜欢把它叫robot,为什么呢?这个。这个之前。我不知道之前递归是。哦,之前有老师讲过递归嘛。递归的含义不就是造一个比较小的自己,让他去帮自己干活嘛。干完活之后,我再去收割它的。

这个工作结果工作成果,那不就是你机器一个机器人,我造两个比较小的机器人或者三个比较小的机器人帮我干活。干完活之后,我再把这些呃结果给组装起来。做是呃完成我自己要干的活,这就是robot。

或者叫包包工头的一种行为。啊,地归其实就是这样一种行为。包工头对吧?我把这个活拆一拆。包给几个施施工队,那施工队的领导再把这个活拆一拆,包给几个小弟,最后这个活就干完了。这是。最简单的办法。

大家看一下DFS。DFS里边的返回结果很显然就是说要多少,最多能偷到多少钱作为它的返回结果。那DFS里边的参数应该是哪些呢?那这些参数。其实我们会把它叫做状态。那些参数怎么定非常的重要。

其实参数的定法跟你你返回结果的定法。更比你防回结果定法更重要。为什么呢?参数它决定了你整个的搜索。的过程。决定了你这个问题,你会怎么拆。假设你的是一个包包工头,你怎么把这个工程怎么拆怎么拆分分下去?

这个是。要看什么呢?要看你拿到的项目是什么样的项目吧,对吧?那这个。括号里的就是你拿到的项目。那我们看一下这个项目应该怎么来定。在习惯上在习惯上我们会用。一种数的方式来表示整个项目拆解的过程。

为什么用树呢?因为。因为他不可能有还啊。拆解过程不可能拆着拆的问题越差越大吧,只能问题越拆越小。所以一张。比如说一张流程图,它又没有还,那它其实就是个数了。好,我们用这个第一个节点来表示。

🎼来表示总的一个流程。总的一个流程是什么呢?我要从哎0家开始投0号0号开始投。对吧一直偷到N号总的过程。那我们用一个括号来表示吧。0N。对吧好。那现在怎么拆?那我总得选一家偷吧,就是我面对一个问题。

我面对0到N一家都没有被偷过的一个问题,我可能要选一家偷啊。那我选哪一家土呢?一般来说,我们会选第一家开始投。那你非要说我从中间一家开始投,那这个我也拦拦不住你,但是你写程序上就很麻烦嘛。

对吧我们一般来说从DD0加开开始头。所以。从零号我们就表示他从零号开始投。那有两种。决策一种是偷,一种是不偷,我偷用外表示,不偷用no表示。假如这个人他偷了这一这一家。那有人问有人回答一下吗?这个区间。

它下一次偷的区间会变成什么?哎,大家要跟上下次偷的区间会变成什么?下头的区间是1到N吗?再想想看。下次偷的区间。A,对,有同学回答是二道的。因为你偷了0号之后是不能偷一号的,连续两家是不能同时偷的。好。

我们就是2到N。假如这家不偷。假如这他不偷。我们会得到一个什么样的结果呢?就是刚才大家所说的1到N。好。哎,大家看这个时候。我们就把一个任务拆成了两个了。对吧假如一个人帮我把这个问题解决掉。

另一个人帮我把这个问题解决掉。那这个问题大家能解决吗?这个问题就是总问题大家能解决吗?这一步一定要想清楚啊,就是说有些人想不清楚地归。真的很多人想不清楚递归或者写不出来。其实就是这一步没有讲清楚。

你把这棵树画出来。大家看什么流程图,其实它就是一棵数啊,你把这棵树或者叫流程数把它画出来。画出来之后你发现哎。我把这个。工程承包给两个人,他们做完了,我这工程也就做完了。你能想到这一步。

你代码分分钟写写出来,对吧?然后我们再看这个人。这个人怎么怎么包?来,有人说说一下吗?填一下这这个。填下这个。来有人来来个人填一下这个。这这里的区间是什么?好吃。这里呢三恩了。这也是一样的。

我们就不不去画了。问题到这个地方,其实这个问题已经解决了嘛。对吧。就差写写代码,写代码真的是一分钟就写好了。这个问题的变量是什么?大家看我们画一个。我们画一个。这样的一个图之后。

我们发现每个节点之间的区别是什么?我们发现每一个节点之间的区别是是什么?大家看每个节点之间的区别是是什么?区别就是说对有人说偷到第几家,或者说从哪一家开始偷都可以,区别就是从哪一家开始偷。

所以他们的区别。每一个点的区别,每一个状态的区别。就是。就每一个节点它的区别,每一个工程上工程项目,他们的区别就是我们要对它的。对它这个括号里所需要填入的东西。括号里所需要填入的东东西。就是说。

你给别人包一个项目出去,你总得告诉他这个项目是什么吧。重复的项目你包给两个人是没有意义的东西。所以我们一定要有一个身份来表示说这个项目。它的T是什么?它的key在这道题里,这个项目的key。就是。

他的从哪一家开始偷,所以这道题很明显了,它的输入是。要有一个index。然后我们再写一个这个。为什么要再写一个这个东东西?再写一个这个东西,它的含义其实并没有什么含义。

含义就是说我们得把这个东西告诉他吧,你必须把每一家的钱,这个是已知的,必须告诉他吧。这玩意儿是不会变的,所以这个东西它如果是个全局变量,你就不用写在这个地方了。这东西只是说附带的写写一下而已。

大家就不用看这个对吧?我们就看前面这一个。好的。那。地归地归大家有说过地归第一个最重要是什么?递归第一行。第个第一行是什么?递归大家写递归的话。低国的第一行是啥?有人回答一下吗?你如果写递归的话。

第一行是什么?有很有很多说法,但是我们一般叫做边界条件。边界条件。边界条件一定要写,比如说这个偷完了呀。没有人在给你没有东西再给你偷了,这叫边界条件。当然,边界条件里边的。怎么return的?

边界条件就是到边界了,我要返回了,不能再往前了。怎么return的,大家不要着急,这里可以不着急写不着急啊,不着急不着急,但是边界条件一定要写。你先把边界条件写出来了,知道地位的边界在哪里了。

保证这个地归不会死掉,不会站一出,对吧?这是最重要的。好,这个到东这个地方不着急。那我们再看一下。我们刚才所谓的把任务拆成两个,对吧?拆成两个。那肯定是一个任务是A,一个任务是B了。拆成两个。

还记不记得第一个。左边那个是什么?是偷。偷就是我把这个都钱给拿了。😡,右边那个是布头,对吧?右边那个布头,我们这里其实就是个零了。我们把左边那个钱拿了之后,下一家就不能偷了,我们只能偷后面两家。

如果我们不拿这个钱的话,下一家就还可以投,我们就投。后呃下下一家就行了。然后返回值是什么呢?返回值其实就是它们之间的最大值。这个递归就写结束了。就这么简单,几乎所有的递归大家不要认为很难。

几乎所有的递归都是这么写的。大家看。所谓的所有地位都是这么写,其实非常简单。把每一个标识能标识这个状态,能标识这个工程。能标识这个任务。的信息全都放在括号里。什么叫人标识这个任务的信息?

就是说假设两个任务之间不一样,会有哪些东西不一样,会有哪些东西不一样。你就把所有会体现它的不一样不一致性的东西都放在里边。记得大家记住是所有啊所有。然后。这样之后。我们就可以。很轻松的写出递归来。

因为返回值就一个嘛,返回值就一个嘛,很轻松的写写出写出递归来。好,我们再看一下。这里的边界条件是什么?大家看边界条件是什么?因为我们这里是一个int。所以边界肯定是return一个int。

有人回答我一下吗?编界条件是是什么?这个程序已经快写完了,编缘条件是啥?好,变条件return0,为什么return0呢?你没没得偷了呀,你之后没得偷了呀。😡,说就是零嘛,没有的偷去0。好。

我们测试一下,测试就点右边一个装code。他可以测试帮你测试一下样例,这题并没有给样例,所以它的样例就是空的,这题没有给样例啊。那我们直接提交来看看。对不对?好,超时了,很明显,这个这题是对的。

为什么这么说呢?大家看我超时的这个点啊,超时的这个点数据量很大。也就是说在它之前,我已经通过了很多数据量小的点。所以这道题的问题不不是它的正确性问题,而是说它的时间复杂度的问题。好。

我们再来看刚才那张图。大家看。假设我们继续写继续写这个地方。继续写。这里是什么?这里说是这里是多少?来,大家。跟上如果继续写,这里是多少?32。这个地方呢这个地方是多多多少?右边右边是多少?RN。好。

还可以继续玩往下写。写到这里,大家就会发现。八蛋。这玩意儿和这玩意儿是不是重复的?这玩意儿和这玩意儿是不是重重复的?在往后的数据计算过程中,再往后的数据,假设你如果往后写会有更多的东西是重复的。

我刚才说了。两个任务我们其实已经把假设它不一样,我们已经把它不一样的标不一样的标记都放在。它的输入里了,就是那个括号里了,这个就是它的括括号,这个就是它的括号。这里就是它括号的内容嘛,一个index嘛。

我们会发现。我们已经放进去了,但是在搜索过程中。这两个任务其实是一样的。对吧因为他们没有。index上没有任何不一样,其实他们的两个任务就是一样的。两个任务是一样的,我们做了两遍,两个任务做一样的。

我们就做了两遍。那这个任务还有很多的子任务,我们也会做两遍。所以说我们有N个任务,我们就会把很多任务不停的做两遍就变成指数级别的了。那其实这题就简单了。有人说用过vicctor保存。那其实大家想一想。

你们在工作中加缓存,用rector加吗?有人跟我说加缓存用re来加吗?这个不太对吧。我们其实最直接的加缓存的方式是用map来加。就是你不要想它是一套动态规划,你如果一直想它是一套动态规划,那。

这个你碰到很难的题目,就是其实这题是很简单了。如果你碰到很难的题目,你怎怎么办呢?你老是想它是动态规划,那他要是不是呢?对吧。map哦,我们在这边加个c吧。开取的初始化的时候。

一定要clear一下这题这个没没毛病。然后在哪家开。在哪家开学?大家看。我们加ca的地方,首先我们不是说加ca啊,我们不是说去调用cach,而是c应该在什么地方被存进去。你先存才能取嘛,你存都没存。

你怎么取呢?所以说我们先看一下我们应该在哪存。一般来说,开你要存,那肯定是在返回答案的地方存吧。返回答案的地方走。那就在这个地方把cash存进去。对吧。该返回的还是要返返回。那存完之后就是取。

取是在什么地方取呢?取是在。可以在边界条件里去。去可我觉得一般来说是跟在边界条件的后面。因为你先判断它这个问题是不是超过边界了,超过边界了你就不需要做了嘛。然后在你实现递归之前。你就和边界之间。

你有一个取缓存的一个过程。那怎么取呢?Oh。是这样写对吧?空开 key。你看这个就是唉判断它有没有有的话。可以看看。我不太记得这个名字了,可能会编译错误。不太记得这个。函数的名字可可能是这个。

我们先提交一下哦,没错,编译没问题。好,再三。好,过了过了过了,其实就是这么简单。哎,我我点我我点错了。这题就是这么简单。然后呢,有人觉得哎。这个。加缓存对吧?好。飞我们先做到这里啊,等一下还会回回来。

其实它本质就是一个加黄色。递归的本质就是加缓存。大家记住这句话,这句话一定是对对的。啊,不是不是递归本,动态规划本质是递归。然后应该是递归加上缓存,这就是动态规划的本质。好的。那我们还要再说一遍。

递归是什么呢?递归是把一个原问题拆成子问题,再组装成原问题,把一个工程包给几个施工队。施工队做完之后,你验收一下,过了,你再去跟你的领导。对吧拿回扣不就是这种事事情吗?拿回扣的精髓不就是这个吗?

那所谓的最优子结构,哎,大家都看看就行了。最优子结构是什么呢?子问题的最优决策可以找出原问题最优决策。午后小息。那什么叫子问题最后决策呢?这就是子问题。也就是说你把一个工程外包给几个施工队。

这个施工队做完之后。你不需要再去返工了,你不需要再去再找一个施工队再来做了,这就叫做。最优子结构或者叫做无后效性。如果说你把这个工程包给几个施工队,施工队做完之后,你觉得不满意,你还要再去返工。

你要再找一批施工队来,那这就有有问题了,那这就有问题了。这道题就有。可能你搜索都做不了。大家要注意啊,一定要留心这个过程。其次是重叠子问题,重叠子问题也很简单,对吧?这里和这里。

比如说这个三和这个三重叠了。大家看为什么要有重叠子问题的前提啊。大家看为什么所谓动态规划要定义这么多什么最优子结构重叠子问题。为什么?有人说一下吗?为什么弄态话要定义这么复杂?哎,其实很简单嘛。哎。

对对对,这这个这个同学说的太好了。就是不然你缓存往哪加呢?不然你缓存往哪里加。如果说没有重叠子问题的话,你缓存完大家,这就体现不出动态图画的精髓来了,对吧?没有动合规划精髓,那他考你考什么呢?

不是就没没考点了吗?所以说一定要有重叠子问题。然后。充电子问题。那它就是冗余啊,所谓的重叠子问题就是冗余嘛。无论在什么算法里。那冗鱼我们就要把它去掉,去掉冗余有很多种方法,其中一种方法。

就是所谓的空间换时间。空间化时间就是加缓存嘛?空间化时间这么。看上去很很有逼格的画,其实就是加房子。那加缓存你不能加太多啊,你不能把机器给加爆了呀。

所以说我们还是要注意分析一下它的时间复杂度和空间复杂度。要划算嘛。对呀对呀,其实就是递归去重复,就是动态规划了。你会写递归会加缓存。哎,动态规划的,我觉得80%的体会你都能做得出来。好的。

我们看一下动策规划的一些套路啊,今天就讲主要讲套路。套路就是说有一个问题。然后让你求。求什么呢?要求最优。求最大求最小求最长,求技数或者求概率。一般的合都在规划。那刚刚有同学问我,为什么说你会加缓存。

只能解决80%,剩下20%怎么办呢?现在20%就是高级套路。就是套路也有分低级套路和高高高级套路。那高级套路就是大家后面要学的一些内容。好,首先它是。这些套路大家记住啊,反正题目里有这些字眼的。

有可能都是动态规划。然后他一定是个离散的问题。什么叫离散的问题呢?就是说大家看。我们刚才。我们刚才去区别这些状态任状态的时候,我们都是用一个in index来区别的。大家注意到没有?

intex index是一个整数。index是一个整数,它是有范围的,就是0到N。那如果index是个实数呢,当然index不会是个实数啊,不会有小数。那假如。两个状态之间区别。就是一个实数呢。

这个区别就很难去区别了,为什么很难去区别?你你可以估量。一个。0到N的范围内有多少个整数,对吧?这个很好估计。那0到N的范围内有多少个实数,你能估计得出来吗?估计不出来实数的数量是无从多个的。所以。

我们一般解的问题都是离散的问题,不是一个连续的问题,连续的问题很难弄。所谓的容易设计状态,哎,其实就是。那个in indexex啊inex就是状态。状态机不是动态规划,状态机是另一个东西。

状态机一般会跟自动机关联在一起。那离散的问题最经典的就是01背包问题,就是整数01背包问问题。什么叫临异背包问题呢?就是说。呃。差不多就是跟我们今天做的那个。偷小小偷偷东西。

差差不多就是小偷偷东西的时候,哎,他的背包有一个上限。就是他最多只能偷多少钱。当然是为为什么说我们加个上限这道题就不一样了。假设。他的上限是100,对吧?他最多只能投100块钱。

他今天偷到100块钱就偷满了。那你偷到99和98。这是有区别的,我当然希望投到99了。但是有一户人家。只有98块钱,另一户人家只有3块钱。海户人家是1块钱。你不可能说哎,我拖完98之后。

今天偷的差差不多,我就不投了。98之后,我要跳过3块钱的人家,我再去偷1块钱的人家凑到999。这就是所谓的背包问题。对吧我现在又随便出了一一道题,就是真的是随随便出了一道题。这也是一道题哦。

本来这道题的难度比背包问题更难一些。你看相邻的两个不能偷,对吧?相邻的两个不能偷,哎呀,我就随随意随口就出了出了一道题。

那问题的共性还有一个共性是什么?最优子结构所谓的N减一可以推导到推导出N。这里这个这句话其实是个废话,为什么呢?我们说了。动态规划一定是能用递归来写的。那地归。之前的老师也说过,递归最经典的事情是什么?

N减一可以对导出N来,这就是递归里面最经典的一件事情。如果不满足这个的话,那就不能用地柜来做。那这只有最后你看。套路对吧?这个没没什么好说,离散问题在家面对的一般都是离散的问题。

最有子结构就是它可以用递归来写,这就是它的问题的共享。再往下说。那基本步骤是什么呢?哦,对,这里的N减一不一定是N减1,A股可能是NN减2了。刚才不是这道题题里面的图,不就是有一个N呃。

我看一下这道题里不就是有一个对吧?加2吗?加2。加二的规模就小了2嘛,我这里的意思只是说简写简写的意思就是说子问题是可以推导出原问题的解的。N减一代表的是子问题。就像古文里边对吧?三个不一定就是三个。

三个指的是多个。一个也不一定是一个,一个指的是多多个若干个。

人工智能—面试求职公开课(七月在线出品) - P14:面对失败怎么继续坚持? - 七月在线-julyedu - BV1Xf4y1r74s

🤧今天给大家分享的话呢,主要是。呃,在为什么转行呃,那个以及我在那个怎么样去学这个算法,怎么样去学继器学习,嗯,以及在面试当中遇到的一些坑。然后我当时是怎么样解决的。

以及这个工作了这么一段时间之后的话呢,嗯自己的一些感受吧。希望能够帮助大家。嗯。😊,首先,为什么要转行做算法?呃,其实从先介绍一下自我介绍。那我这边是java开发出身,然后自己是学了大数据。

学了一段时间之后又转了这个大数据的开发。后来呢就看到这个机器学习特别火,然后就想着学这个机器学习。结果自己学了一段之后,从网上找各种资料,发现。学的不是很系统,就是这有一点,那有一点儿。

但是说你给别人去介绍的时候呢,就没有一个完整的体系赛。所以后来就报了7月在线的那个机极学习。而且最终也找到了那个工作。我目前的话呢主要从事一些推荐搜索和ILP。然后在一家互联网公司,现在的。呃。

工作的话相对来说已经稳定了。当时为什么要转行做这个。呃,记忆学习或者说是算法呢,最主要的原因是穷。就感觉要找一个高薪的一个工作。而这个高薪的工作的话呢,当时接触到的话呢。

就是做算法的工资相对来说是比较高的。呃,而且的话呢我年龄比较大,也30多了。所以说是如果就是还干开发这个方面的话呢,就已经相当于到瓶颈了吧,就是除非你去大厂里边。找一些那个,但是呢我这个技术水平的话呢。

又有限,那只能找一个相对来说还不在不太成熟的一个行业。然后门槛没有那么高。然后这时候的话呢,我能进去。然后如果可以的话,从互联网里边可以镀个金出来的话呢,去找一个工作也比较体面,而且工资也比较高。

其实我转这个算法的话呢,最主要的原因就是。工资高。而且的话呢可以遇到一些就是比较聪明的人啊,我一直感觉就是做算法的人,他们都是属于那种。呃,比较聪明的人,而且就是说高校毕业的人比较多。从那个。呃。

浏览的一些博客上面或是知乎上面可以看到呃去做那个。呃,算法的人的话呢都是名校毕业,要不就有大厂背景。嗯,他们的工资也比较高。所以说主要还是出于一个羡慕的心理存在吧。当时就是一拍脑门儿。然后就去学了。

然后就是在学之前的话,其实自己也犹豫,为为什么要就是去放下现在的开发工作?其实当时我开发工资也还可以。呃,后来的话又和别人聊,然后就感觉现在的话AI是一个趋势。你可以看,就是从政府也好,呃。

企业呀或者学校,包括一些学校这开放这个算法课。有的一些那个呃那个企业,尤其是事业单位或者那个国企,有一些单位他都主动的就去开这些那个算法的岗位。而且所有的这个岗位的话呢,入门级别的都是。

而且它要求相对来说不是那么高。这个时候我感觉对于我开发出身的是个机会。嗯,而且跟着这些人在一块共事的话呢,他们身上的一些习惯啊呃你可以学习学到很多东西,感觉。而且目前这个整体来说的话呃缺口比较大。Oh。

我们公司的话呢,目前还在招那个算法工程师,而且。那个特别需要。那个去面试的人。就是能够。能够符合的并不是太多,但是能找到一个合适的人的话,特别特别难,找工作的人难。工作就是公司里边招人的更难。

所以说是现在的话,如果是系统的去学一下的话,去找一个工作的话,感觉还是可以的。其实现在的话算法工程师的话,我我这边还做了一个截图,大家可以看一下这个薪资待遇还是相当可以的。

而且就是说他后边标的那个硕士啊,那个有的是是博士啊什么,那个都不是说是死规定。其实你技术可以的话,也完全可以达到。你那些主要是还是看你的能力,嗯,而且大家可以从其他的那个boss啊、智联啊、拉钩啊。

可以自己搜索一下看一下。那上边的那个工资的话呢。都是普遍比较高的。你像一般的初级水平的话,20K。呃,30K40K这都很正常。你像其他我原来做开发的那些呃岗位的话,拿到这个水平就其实很难了。特别特别难。

而且就是需要不断的加班。第二个方面主要给大家分享的是怎么样去学这个算法。其实。最主要的你如果。从这个学算法刚开始的话呢,最好有一个习惯学习数据结构和let code刷题,这个特别特别特别重要。

因为在一些公司招人的时候,他考考量你一个人是否有能力的话呢,主要有几个方面。第一个就是你的code的能力。第二个是你的理论知识能力。第三个就是你的实际操作。经验也就是说你的项目经验。最后一个的话呢。

有可能会考察你的表达能力啊,或者看你这个人性格怎么样啊,是不是很聪明的一个人,是不是主动思考的一个人啊,他会考察这一方面。所以说第一个基本上去面试的话呢,上来第一个就出一个lets code。

就出一个code题,让你写个代码。如果这个代码写不好的话,第一印象就大打折扣了。Yes。而就是可以有一个良好的习惯吧,在每天去学这个算法的时候,起来第一件事儿可以先写一个代码题。然后的话呢,每堂课。

学完了之后,最好是跑一下项目代码。然后多思考为什么是举个例子,为什么是逻辑回归这个模型,而不用SVM模型。那我用SVM模型会带来什么效果?我在这个模型上可以做什么优化?做哪些方面的优化。

会不会效果会不会更好,会不会带来一些bad case等等一些问题。要自己的话,要有一个动手的能力,还要有一个思考的能力。在这个敲代码的过程当中,而且还可以培养你的那个手感敲代码。

然后的话呢再分享再那个去参加一些比赛。在那个你的简历上边。呃,如果你你的那个项目经验不是很多的话,一些比赛经验的话是很必须的。而且很多人的话他会。感觉这个你参加过比赛,而且就是你最好取得过一定名次的话。

就感觉你这个人最起码是比较聪明的一个人。然后的话就是简历上面的话呢,分数会特别高。然后这一般的话给那个技术官去看的话呢,他们一般都会喜欢就是有一些呃这个参加比赛的,然后最好是取过一些名次的。

一般都是比较喜欢和这些人来聊一聊。因为在实际的业务当中的话。大家嗯都是去偏向业务做那个算法开发嘛,其实投入的话并不是很多。然后一旦是遇到在比赛当中取过一定的名次,而且以自己的业务又比较相关的话呢。

都想着来聊一聊,看看大家是怎么做的。然后作为一个交流。这个的话,其实对于一个简历来说,特别特别重要。🤧嗯。😊,然后是学习算法的本身的话呢。就是面试当中的话,第二个就是理论。你要掌握这个算法的话呢。

要要深入一些。就不要停留在技术层面,就是就是讲师给你讲的一个算法,从原理以及到什么欠拟合啊、过拟合呀,怎么样去解决过拟合呀等等讲到这儿了。然后你自己要去深入下去。就比如说一个一个算法里边。

它有可能用了L一正则。🤧那咱们。哎考虑一下,哎,为什么要用L一正则,用L2正则行不行?呃,L1和L2正则有什么具体的区别?然后这个模型的话。呃,本身的一些推导哦,以及为什么要这样为什么要这样推。

就是反复的多去推导模型是。锻炼你的思维能力的一个好的方法。而且就是说自己最好是深入进去,多去了解一部分背后的一些东西。你比如说现在比较火的那个茶几 boost。去问去那个面试官去问你的时候。

他说那个LR模型和叉几 boost的模型有什么区别,哪一个更容易过拟合,你能不能首推一下,然后叉几 boost的和GBDT的区别是什么?你能不能首推一下,然后他们主要的区别是什么?

包括那个分位算法是什么?为什么那个叉几 boost的就好。嗯,它好在哪里?等等等等。这个模型背后的东西最好是了解一些呃,不是停留在就是我只会推导,我推导了很多遍,但是说你只会推导的话。

还是停留在理论知识层面。如果就是说你能了解到它背后为什么那么做。这个的话对于你以后去解决项目当中的实际问题,特别特别有帮助。🤧。而且这样的话呢,你可以从考虑模型之间的对比的话呢,在实际业务当中。

你再去用模型去解决一些实际问题的时候,你就会从这个工程层面,哪个性能层面,哎以及它那个实现的复杂度等等一些方面,你都会有一个自己的一个见解。你在实际工作当中不可能就是有人告诉你,哎。

你把这个用LLR模型给我跑一遍。哎,或者说你你用你用叉几 boost的模型把这个业务解决一下,没人这么告诉你,你只能靠自己去判断哎,我用什么模型把这个问题解决会更适合一些。

哪个模型会更适合这个这这个场景。哎,为什么适合这样的场景。哎,这个模型的话,是有会带来什么样的效果。我以后的迭代是不是。可以迭代,我从哪几个方面迭代等等。这个模型背后的一些东西的话,最好是要要掌握。

因为这个对于你的实际工作的话呢,还是比较有帮助的有可能。对于那个面试的话,会起一定的作用。但是说这个最大的作用还是对于工作之后。最后一个就是这个算法的落地上边,这个实际的这个算法怎么样去落地。

这个是特别特别重要的。因为这个涉及到你工程里边的一些实际项目。你要很清楚的表达出来你的实际工程是什么样子的,你的性能是什么呀?你这个项目当中有什么bad case,你是怎么样去解这些bad case的?

比如说那个搜索当中。我去命中一个。一个商品,比如我命中的是连衣裙,但是呢就是有一个产品的话是连衣点点点点裙,它也命中回来了。但是很明显这种这种命中的话不太合理。这就属于是一些bad case。

那么针对于这些ba case的话呢。你要有一个思路,哎,我怎么样去解决ba case会好一些,从哪些方面去思考,这个是特别重要的。也就是说,在于这个算法的本身,你要掌握算法的理论基础以及算法背后的东西。

算法为什么要这么做,这么做的好处是什么?以及在我用这个算法会带来哪些bad case。然后这些bad case的话,我通过什么样的方式去解决。这个的话呢就是很好的去让你掌握你的项目工程。

你的项目里边的话一些具体的细节呀,一些指标啊,那个我感觉。它随着你的那个迭代的话,会有会在不断的提升,不断的改进当中,都是一个动态的一个数值嘛。所以说更重要的是什么呢?

更重要的是你怎么样有一个自己的思路去解决这个bad case,也就是说这就是有一些面试官,面试别人的时候考虑的,就是你有没有主动思考的能力。就是说我现在的现状是这样。

那么出现的一些ba case是什么样子的?如果让我去解的话,我从哪几个方面去解这些ba case。会好一些,而且就是它能够带来性能上的一定提升。这个是特别重要的。然后的话是一些工作的一些感受吧。

我从那个工作当中的话,一些感受实际是这样,就是。工作之后呢,就感觉算法的话,学习只是停留在了基础层面。还是需要不断的去学习。这个学习呢就不仅仅是算法本身,它会涉及到你对数据的理解,呃。

操作数据项目的一些工程的一些学习,一些业务的学习。呃,这个层面的算法相对来说内容要少一些。第二个是什么呢?就是说我去解决一些实际问题的时候。我的那个算法,我从哪几个方面去考虑,这个也是特别重要的。

比如说我解决一个对于文本,对于那个商品的一些评论的时候。大家都肯定都知道什么TFIDFword to a这种这种模型。但说在实际当中的话。有可能这两种模型都得不到很好的效果。

但是呢IDF本身的话就能得到一个很好的效果。但身为什么是是是这样的一个情况呢?它不仅仅需要你理论基础,也需要你的实际动手能力。有一些东西是需要通过。你的实际的一些训练出来的结果去展示出来的。

然后你有可能哦才会明白出来,哎,有可能是持频的问题,或者说有可能是学习本身窗口滑动的大小,然后会造成这些ba case。等等等等。一些实际问题特别特别多。

而且就是说你怎么样将学习到的那个知识应用到这个实际工程当中。这个特别重要,你有一个项目的话呢,要解一些呃排序问题。那排序问题的话,有什么lamademar呀,还有其他的一些模型。那我为什么要选这个模型。

以及我怎么样用这个模型去解决,这就涉及到你怎么样将自己学到的知识。应用到实际业务当中来听鸡汤。嗯,我这个分享算是鸡汤吗?我感觉不算是鸡汤吧。🤧嗯。然后最后的话就是你的抗压能力,就是实际工作当中的话。

尤其是你经过这个学习之后去适应这个互联网的话。呃,最重要的是加班。呃,有可能这个。他今天给你提的一个需求,明天就要上线,或者后天就要上线。这要求呢就是一个是你的实际动手能力。然后提高自己的那个效率。

另外的话呢就是需要加班,这个很正常。很多那个这种做算法的都需要加班。而且就是。需求特别急。反正我目前的状态的话就是一直需要加班的状态。其实按照PPT来来说的话,其实给大家分享的就就这么多东西。

但是怎么说呢?嗯撇开这个PPT的话,大家就是可以跟大家聊一聊就是。😊,一些实际的东西,因为这个东西太模板化了。算法比开发加班少吧嗯。会少一些,这么跟你说吧,就是你一个算法要上线。

肯定会有工程组的人就是去他去部署这个算法啊。但是的话呢他预上线也好,正式上线也好,你得跟着你不可能就是说那工程组的同学把这个你的算法给你上线了,你得验证验证这个效果,是不是你预上线的那个效果。

是是不是你要的那个效果。我是做什么的,我是做推荐和ILP的,也做搜索。但是我目前做搜索册的特别少,主要做推荐和ILP。所以说做算法的话也是需要经常加班的,但是确实比开发要少一些。

开发不仅仅自己上线要加班,算法上线也要加班。所以说他们相对来说比算法加班要多一些。而且算法的话其实呃实际工作的话呃,代码量会特别少,呃,会偏策略多一些。我的学历是本科。是本科。

找工作的话就是比较吃亏的一点,也是这样,就是因为本科嘛呃找工作的时候就是很可能就会被刷掉一些。但是这很正常,就是你这家不行,下一家下家不行,再找再下下家。一定要自信。不要这一家就否决你了。

然后就感觉啊我是不是能力不行啊?CV本科好找吗?CV本科。好找啊。这个其实还是看这个实际的能力吧。你如果就是背景好一点,然后的话就有可能相对来说会好一些吧。然后尤其是年底这一块,跟大家说。

其实HR也好和项目组也好,其实他们自己都是有KPI的。所以说他们是有这个任务的,比如说要招多少人,而且年底的话呢,有一些岗位还走一些人,他们本身招人就已经很难了,而且还要走一部分人。

这这个对他们来说压力更大。所以说尤其是年底这个找工作的话,其实相对来说比9月份、10月份和来年的话要好得多。😊,还有什么问题?我我从这可以跟以大家随便聊,反正这个PPT的话,其实其实就是这么多东西就是。

年底都不要年终奖吗?这个看实际需求是这样,就是给你举个例子。就是这家公司的话呢,尤其是刚毕业的学生,我有一个同事也是他从这儿的话是一个月,有可能是20K左右。另一家公司的话呢,直接给开到40多K。

然后你说去还是不去你的年终奖也也可能就是一个月2个月的工资,也就是说年终奖的话,也就是2万到4万。然后去下家公司的话,下家公司的话,呃,直接上来就是4万多。你感觉你要等年终奖吗?你也30多。

本科java开发投了N多就面了5家。诶。其实那个。那5家我感觉不多呀,这个很正常,主要看还还得多投。然后的话呢呃我我不知道你是从哪里投的,你可以找一些那个论坛。然后的话呢那个推荐的一些一些论坛那个。

那里边有一些都是内推的,而且就是说他们找不到人的话,就是会有KPI压力的这种的话,就是相对来说你直接就把你推到他们组。这个的话面试的流程一般会短一些,而且就是相对来说会宽松一些。

因为在那个招招不到人的时候,尤其是年底的时候,过于压力,他们会降低一些这个对于去面试人的一些要求。你你如果就是说那个这时候去面试的话,对于一些比较急的岗位的话,他们相对来说呃,对于一些扣的题。

他有可能分简单嗯,中等和呃难度比较高的。但是说如果平常的话会有一个完整的面试体系。如果这时候去面的话,有可能就是处于是简单或者中等的一个水平的一个代码题。

而且就是说他又不会要求你说是对于这个算法会考察你特别特别深的内容。这个这个时候一般就会少相对来说会少一些。Yeah。所以说你面了5家,我感觉不多,因为我面的。比5家多多了,是。金三银四跳槽的话。

是不是竞争就强烈?对呀?嗯金三银四那时候大家都跳槽,你你也跟着那时候跳槽的话,你的核心竞争力是什么?核心竞争力的话,你如果算法能力和你的那个呃实际工程能力,如果。都都比较强的话。

那你可以就是说考虑那时候跳槽。其实。相对那些的话,咱们大家的话有可能实际的业务能力有可能会弱一些。实际工作CVNLP需要学习。传统算法我不知道你说的传统算法是什么,你能举举个例子吗?你说传统算法是。

是是基于代码的那种什么快排啊,那那种数据结构类的算法,还是说是一些统计类的一些算法?在这个CV和LP当中学习的话。这这些算法其实都是都是需要的。而且就是你如果去那个做CV和LRP的话。

它比那个机器学习对这方面的要求要更高。如果你去的话,只要是去,基本上就是你他就都会考察你像什么堆排序呃,链表呃,以及那个其他的快排二分查找,就这种最基础的啊。

这这这都是那个什么电子offer指南上面的一些最基础的题。这个必须要刷的。我我刚才在那PPT里边也说了,这这个最基术的题。你如果这个都不会,这个就是说比较弱的话。😊,我建议大家先不要去去找。

因为这个最基础的,无论你是找的是中等高等还是初级的一些那个算法工程师岗位。代码题这个是必不可少的。除非你去做什么总监,做总做那个专家,做那个设计层面的东西。如果就是不是。

那这这个离不开这个数据结构的这些这些基础的一些算法的话,离不开你你的必须要去做的,必须要刷这些题。而且就是说嗯大家可以就是怎么说呢?从那个算法那个从那个7月在线上面不是有专门的那个。呃。

这种数据结构的讲解嘛,大家可以就是理解透了之后再去再去做这些题。而且你去背代码的话是没用的。在那个实际考察你的时候,面试你的时候,他就会把这个这个经常刷的题稍微改一改。你如果只是说背了那个代码的话。

有可能就是在面试上的话就是很吃亏,他会就稍微改一改。因为这个很灵活嘛,我稍微改一下就可以。所以说是这个对这方面的要求还是挺高的。大家一定要就是有这个意识噻。如果想出去面试的话,第一是扣的。

第二就是理论基础,就是你的什么LR啊,X几 boost啊,算法推导啊等等的一些东西。包括你的一些实际的项目经验。面试会考察图优化的内容吗?我是没遇到图优化的内容,我去面试别人的时候。

我也没有问别人图优化的内容。这个一般。嗯,没有去问图优化的。基本上大家都问的一些比较实际呃,一些贴近于实际应用的东西,可东西会更多一些。就是我给你举一个问题出来。

然后的话呢你要说一下你的解题思路是什么样子的。比如说有一些特征工程,然后你是怎么做的?然后你为什么要这么做?你你的考虑的点是什么?然后的话你为什么要选这个模型啊,你会定哪几个指标去看?

然后的话这每每一个指标你打算怎么样去优化等等的一些过程。所以说没有说是考察优那个图优化这个呃我是没遇到过,也也没也没问过别人这个。对于这个做算法这一块的话,我感觉。嗯,对于那个转行来说的话。

还是挺不错的。目前来说的话。呃,要求相对来说不是很高。嗯,我去阿里面试过,然后阿里那边的话就是对于这个也是出了一个代码题,就是嗯数据流当中一K个大的数,这个其实也就是堆排序嘛。

然后的话他问的也是比较贴近于实际工作经验。然后问的是那个你的推荐是怎么做的,召回是怎么做的?然后你你做召回的时候考虑的是什么?然后的话召回量是多少等等一些一些实际问题会更多一些。

他不会问你什么你这个算法啊,什么图优化呀什么,这个基本上没有没有这么问的。大家还有什么问题吗?可以随便聊。哎,对了,我忘了跟大家说这个你去面试的时候,你去认定了自己的一个薪酬范围的话,一定一定要坚持。

不要随便的给自己向下降。这个。你去给自己定的这个薪酬范围,如果感觉自己的能力能达到,而且就是可以的话,就一定要坚持住,不要随便就是妥协,随便妥协的话。就很难就是一是就感觉你你这个人就是好说话。

另外的话就感觉你这个人有可能没有就是你说的那么厉害。这这是我自己的一些感受啊。会考察首推机器学习算法什么的吗?比如EM。呃,这个看你的那个简历上面写的什么。然后你如果写的就是有有一些那个算法的话。

他有可能会让你首推。呃,你主要是写这个简历的时候,你主要是写自己熟悉的算法嘛,你不要写一些比较生僻的,你自己不学习的一些。一些一些算法,你还是写就是比较熟悉的一些算法。现在就是我当时遇到的是一个呃。

LSTM的一个。然后的话呢让我从把那个公式的话整个写了一遍。然后我不仅把公式写了,我还告诉他那个注意力,因为是当时说的那个model是sequence to sequence model。

然后的话我把各种注意力给他写了一遍,包括对齐模型。了一遍,为什么现在流行的是这种注意力?也就是呃巴大脑和那个long那个attention机制。当时为为什么就是用这种他们的区别是什么?等等一些。

包括后来的那个brt的transformer的,然后的self attention就是4注意力模型。这个的话我当时是写过,但是写这个首推的话,是首推过SVM和叉 boost。对,这个看实际情况。嗯。

因为在以前的时候。我记得有同学跟我说过,说那个呃只要是问到茶记 boostt,然后你就不管那个问你什么,然后先首推一遍,然后再看那个再说。嗯,结果呢就是我有我也有这么一次经历,还真的就首推了一遍。

结果呢遇到了一个高人,他是给那个陈天吉博士,就是提那个brarch的一个小伙伴,他就是提那个提代码的一个人。所以说他会就是感觉这个首推的话太一般了。然后的话他就问你就是分位算法。嗯。

当时长级部当中为什么只用到了二阶求导,为什么不用更高阶的?然后如果说是我自定义一个损失函数?呃,我都需要考那个注重什么?然后的话为什么是二阶导数等等一些东西。

还会考虑你为什么这么呃为什么的问题会更多一些。你的回答都。这些题目的回答都是给一个思路吗?嗯,对呀,我只能给你一个思路。因为我从开始面试到最后来的面试,遇到的面试问题太多了。

我不可能一个个的把这个问题的话全抛出来才解析。那。好几碗也不够啊,所以说只能告诉大家一个大概的一个思路是什么样子的。Yeah。而且就是说循着这个思路,你要有这个自己的这个思考能力才可以。

你如果就是说一个题那么解,然后你就记住了。然后再再有一个题的话。就是还照搬的话,就有可能有问题。其实学算法本身的话,大家要有。这个主动思考的能力。嗯,这是特别重要的。我们去那个去面试别人的时候。

有有有一些同事的话就特别愿意考察这一点,说你这个。举个例子,前一段时间吧,有一个同事去面试别人的时候。说那个其他回答都很好。然后就是有一个问题说是哎你们这样做的话。

现在呃嗯现在有这个这个效果的话是怎么样子的那那个面试的那个去面试的那个同学就说啊现在效果嗯就这样,然后的话整个行业都是这样子的。然后这一下我才同事就说这这这个人不行,他不会主动思考。哎呦。

我可以从哪几个方面去去去解决这些情况,去解决bad case去提升。所感觉这个人太懒惰了,一点不去主动思考,就这么一个一个一件事儿,其他的他回答的都很好,然后直接就pass了,直接就把这个人pass了。

二面都没进,就就直接干掉了。大数据转推荐算法有什么需要注意的吗?注意的。大数据转推荐算法。这一件很很很流畅的一个流程啊,我感觉。😊,你大数据转推荐算法,这个特别特别适合。

因为那个推荐算法当中更多的是一些工程问题,你会涉及到一些那个数据的清洗,然后包括那个抽样本呃,正正副样本的一些一些抽样。一些特征工程都都是基于大数据的会多一些。像sk啊,have啊。

呃还有那个什么map reduce等等,都会都会涉及到呃故意的东西。嗯,我感觉如果就是说你说注意的话,就注意什么呢?就是have我一定要熟悉那个你的那个spk那个呃那个实际应用能力要要有。

然后的话就是结合算法本身去跑你的模型,嗯,去因为那个实际去跑的时候,有可能和学习的是不一样的。咱们用的是茶几 boost,有可能是paant那在实际工程当中就要求你必须要用。java的掉那个架包。

等等的一些东西。这个的话需要你去实际动手的时候,考虑到这个在学习当中有可能是python版本的。但是实际工程当中有可能是java版本和什么sella版本啊,其他的版本的。而且就是说你如果是大数据的话。

有可能就需要你去更多的有实际动手能力嘛。我感觉这个大数据转推荐算法是。呃,特别特别特别特别适合。模型很多pathon写的那spk怎么跑?大哥,有很多都是有java,都是有架包的。

你不一定非得死死咬着那一个就是pathon的那个版本啊,你像叉几不死的,它就有架包啊,你就可以调用架包就可以啊。但是说具体的怎么样调用啊,怎么样去流程啊,你要看一些API啊,按一些实际的工程代码啊。

这个你你是要自己去看的。而且就是说即使是这样的话,我也可以就是封装啊等等一些一些东西都都是可以处理的。这不是死的。😊,PYpar呃,不一定。这个真不一定。呃,那个我们在用到的那个项目组的话是这样。

就是目前的话没有见人搭,就是自己去搭一套PYpar没有,有可能其他公司会会有吧,但是我们这没有,基本上大家都是该了要吧嗯python,但是python的话没有跑那个sk。这个的话。

你如果自己非得要跑的话,也可以自己搭一套PYpar。但是没必要啊,同学,你本身做大数据的,你再去搭一套PYpar,你不自己费劲吗?😡,对吧。😡,你可以自己跑java或者跑scanva,这不更适合吗?

展现你的长处啊。现在工作的当中的时候,这个你的那个个人输出的话,会就是很容易引起这个领导注意啊。你这很快的适合这个工作特别好。实际工作当中pathon怎么用?嗯,pathon的话主要是跑一些那个。嗯。

实际当中的工程当中的一些脚本。可能会用到python,另外是什么呢?是训练模型会用到python。嗯,然后的话就是如果数据量小。你有可能会就是把数据load到本地。

然后你也可以用python去看那个模型分布啊,那个那个数据分布啊,然后去train model啊等等都可以。包括在一些GPU上,一些那个训练的机器上,你都是可以用pathon去处理的这这时候的话呢。

都会用pathon多一些,但是实际要上线啊,要去加载啊等等一些东西的时候,工程的话还是会用java更多一些。而且就是有的。会对于python的要求的话。并不是特别多。如果就是说你是做这个NLP的话。

要求python可能会多一些。其他的。其实更多的偏向于工程。大家要记住一点是什么呢?就是说咱们学算法是为了解决实际业务当中存在的问题的。而实际业务当中的话呢,由于以前这个各种java C呀。

还有python语言。它本身存在的现状是什么呢?就是java工程特别多,java的项目特别多,尤其是java写的一些we部项目特别多。这个时候不可能让你重新用python去实现一遍那个工程。

然后的话配合这个python跑模型,这是不可能的。咱们只能说是用算法,用python也好,用或者是用其他语言也好,写出来模型,就为这些实际业务解决问题。

并不是说实际业务当中并不给大家提供一个就是用python写模型的一个工具。想问CV的具体工作是怎样的?呃,这个真不好意思,同学,我是做NLP的CV的话,我只是了解过具体的工作。

我不太清楚他们具体工作是什么样子。但是我感觉CV的话应该也是。做这个主要还是写这个。C位的话,我听一个同学说好像是。他们调一些实际的这个模型,实际的这个这种框架会更多一些。

但是说也是分这个工程和这个算法,它是偏算法多一些。所以说实际工程当中的业务的话,他不怎么参与。主要是训练模型,看paper,感觉那个特别好。怎么样?同学们还有什么问题吗?工程的话。

跟开发是不是没啥区别了?诶。呃,有区别。是这样,就是说咱们的工程的话嗯。是是这样的,就是说咱们做算法的里边的工程指的是什么呢?就是说你做特征工程,你做特征的一些抽取,呃一些样本分布等等。

就是他会抽离出来公共的模块。然后这一部分的话呢,是咱们算法里边的工程。这个和那个呃和那个就是咱们普通做那个开发的那种还不一样。因为他那个做开发的话,有可能会涉及到一些框架的东西。如果是java的话。

会有什么spring啊,会有什么habernet呀be等等一些东西。如果就是说。咱们算法当中的开发的话,就不会涉及到那些东西,就会涉及到对数据本身的一些处理。这些工程会更多一些。

它与那个呃完全写代码啊还不太一样。因为咱这边就是一旦这些工程完善完了之后的话呢,再不需要怎么更改。你只需要会去用就可以了。也就是说出现了对一批数据需要进行抽特征。然后的话呢。

我只需要哎这个特征是怎么抽取的,我只需要知道怎么用就可以了,不需要就是说重新再写再去开发,这个不需要。还有什么问题吗?同学们。这个。如果大家现在都是处于找工作方面的话。我我感觉那个主要是刷题。

加业务深入一点,然后加算法深入一点就O了。嗯,就是多面,然后就是锻炼这个表达能力和你的那个自信能力。一般就没什么问题了,因为这个找工作,我感觉本身就不难。然后的话你掌握了这几点的话,基本上就都没问题。

我说的这个深入的话是不仅仅停留在这个算法的推导上,你要掌握一些算法背后的一些东西。比如说上来有可能有人问你这个随机梯度,那随机梯度的话,是一阶导数还是二阶导数,然后的话它是随机采样还是非随机采样。

如果是随机采样,是还。飞机那个随机采样还是非随机采样会带来什么样的后果?为什么要这样?然后的话我用什么方式可以解决等等一些问题。嗯,这个的话在网上会有很多。

包括咱们就是有可能有一些人比较熟悉什么ROC啊、AOC啊等等一些一些一些指标,那有可能会问你AOC是什么?然后的话AOC那个那个图大家都会画,那么有可能会问你那个图当中的那四个点。

就是美那个00111001这4个点分别代表什么?等等,就是更深入一,希望大家更深入一点吧,就是老师讲的只是入门,你不可能就是用完全用老师讲的那些东西去面试。我感觉那个就是有有点难。

但是说你要是在几个上面会深入一些的话,有可能就是相对来说比较简单一些,因为你有亮点了嘛,说白了你有亮点,如果就是说你有了亮点的话,其他的东西一般的话他也会要你你不需要每一个算法都准备的特别好。

你只要把你。熟悉的那个算法掌握住,然后。深入一部分,你认为别人是不知道的东西,这就是你的亮点。这就可以了,你不需要每个算法都掌握,每个算法都掌握,那太难了。需要做什么项目,简历上怎么写这些。

这个需要这个需要你那个。更多的去了解一些实际的项目吧,应该会那个讲师会给你一些项目。呃,你如果感觉和自己的不合适的话呢,你可以从网上搜一些什么,你感兴趣的一些一些项目的一些框架。呃。

比如说你做那个图像识别,你是走那个CV方向,对吧?那你可以搜一下,就是那个关注一些知乎上面,搜一些CV的一些那个比赛项目,或者说是一些那个比较厉害的大牛,他们分分享的一些文章,因为现在的话呢。呃。

很多很多人的话都喜欢写那个算法的那个分享论文分享的那个文章。你可以从里边找一些就是他们自己做过的一些分享。嗯,你可以关注一些那个公众号。比如我自己我就喜欢关注什么美团呀,呃五八同城啊,京东啊。

呃还有百度啊,腾讯啊,我我喜欢关注他们的那个呃公众号,公众号里边会推一些那个呃技术文章,技术文章里边的话呢,他会带着他们的那个呃项目的一些框架显示的那个PPT也好啊,或者说是一些文章,你可以从这里边。

其实你可以照甚至你照搬都没问题。就是有有一些有一些东西在里边,因为这些框架是通用的嘛。而且就是不同的公司之间也是相互借鉴的。呃,你你可以看那个美团的那个技术的,它不是有自己的那个网站嘛。

你可以从上面看到那个他们自己的那个网站上面会有。呃,关于图像识别也好,还有那个NLP也好,他们都会有自己的应用场景。这个的话你可以结合他们的应用场景,写一些自己是就是感兴趣的一些项目。

主要还是你把自己的项目得掌握透。这只是给大家一个思路吧。反正这个问题的话,其实我感觉不难解决,主要是还是靠你自己怎么找那个能找到一些自己感兴趣的。我的那个微信上面基本上现在的话也经常在看的。

有一些那个他们的那个文章,像什么呃五8技术啊,呃像什么呃什么新智源啊等等一些。一些常看的一些,他们会把自己的业务会贴出来。你如果想做推荐的话呢,你可以从网上一搜什么京东推荐框架啊。

什么技术分享或者搜一些什么5八同城嗯,推荐框架,然后推荐的技术框架等等。你如果说图像识别的话,那你可以搜一些。那个美团的美团好像做,我从美团上好像见过美团做那个他是做有一个场景是做什么呢?

就是做那个图像当中文字的识别。因为不同的呃饭店也好啊,或者说是那个那个路标上也好,会有一些文字在上面,他会从那个呃从上面把具体的文字识别出来,想了解一下咱们课程的同学啊。啊,这个可以。

是老师打的广告什么。🤧嗯。具体的话可以咨询一下那个老师,那个老师的话。哎呀,同学,我的路子不够野,老师的路子比较野,大家可以学习一下老师的路子啊,就是找到比较适合自己的一些项目。其实方法有很多,嗯。

主要是你看你自己感兴趣的是什么。你做那个CV的话,那你是做识别还是做分割等等一些。具具体感兴趣的具体的那个点不能太。太那个广的话,不太不太好不太适合。因为有一些现在对于算法的话。

大家更适合就是更喜欢找一些深入一点的能解决实际问题的人,一些同学,然后过来直接哎解决实际问题。这样的话呢,你同事也好,你的你的上司也好,就会特别喜欢。然后的话甚至给你升职加薪都不是问题。

因为现在算法这方行业的话是特别特别缺人就是。捐您圈到什么程度呢?就是。HR和那个技术里边的话,就是压力就是每周都能开会到这个程度。嗯,大家还有什么问题?没事,大家有问题,你就在里边就是提就就可以了。

我还是喜欢回答大家这方面问题的。就看同学们关心的东西。没有了吗?同学们。没有了,我就要快下线了,同学们有问题就赶快问啦。因为我的。都是血淋淋的教训。经验的话。没什么经验,但是都是一些教训。

转换没有实际项目怎么办?转啊转行没有。像实际项目怎么办?比赛啊,同学。比赛的项目那都是项目啊。就是很多公司这么说嘛,很多公司,我刚才PPT当中也给大家讲到了。

很多公司就是因为他们偏向于就是解决实际业务问题,说浪费了很多的时间。然后在一些策略上,在一些呃项目的push上面,所以说是。对于一些那个项目当中的一些实际问题的话,他们更就是有更快的解决方案。

但是对于算法本身的话不一定很强啊。同学就是说他的算法能力不一定有你强,甚至是一些老员工也好,你的leader也好,在一些算法上,他他没你厉害。因为它是解决实际问题更多一些。但是说用用怎么把这个算法用好。

怎么样把这个算法应用到极致,把这个指标提高到最好,它不一定比你强。因为在那个我们的项目当中。解决了一个一个问题,他们是拿了一个比赛的一个一个算法去,就是一个一套流程去解决了一个实际问题。但是这个的话。

我们组里边。没有人能做到。我我我刚去的时候就了解的真的会有这么一个实际问题。他们真的去从那个天池上面去看,就是别人是怎么样做的特征工程都做了哪些。然后的话呢有没有用这个一些特别复杂的一些算法。

然后的话呢,他们有没有观察数据的分布,然后等等一些东西。老是996吗?我不是996。但是。嗯,每天。的时间会长一些,有可能回来的话11点多,因为那个经常要上线,所以说时间会长一些。呃,是双休。

但是每天的。时间的话有可能。10点到9点或者说是10点到晚上10点11点都有可能。这个看实际情况。参加比赛成绩不咋地。呃,如果真的有这方面的话呢,同学这个需要你自己结合你自己的那个呃实际的工程去解决了。

这个有讲师,有很多野路子可以告诉你,这个我就不过多在这里透露了。比赛的项目,咱们的集训营救援也有项目。对,都有有很多这方面的项目。这个你不用担心工作对发表的论文有要求吗?哎。你有发表论文吗?呃。

这个一般就是写在简历上,这个都是降分项啊。如果就是说你有发表过论文的话,这个特别好。然后的话一般这个都是特别喜欢要有有发表过论文的。不景气,现在ARP工作好找吗?好找啊。为什么不好找?

大家说经济不景气的时候。是相对于一般人来说的会多一些吧。然后你主要那个为了这个基础够够牢的话,我感觉找工作的话相对来说没有那么难。Yeah。很多岗位大家不用担心这个的话。

现在互联网公司都说前一段时间一直炒,那什么这个公司才20,那个公司才30。那不照样还得招人吗?同学他裁的是什么人?裁的是你站在这个工作岗位干不了这些活的人。那实际问题当中谁去解决都裁了。

谁去解决他们的压力这么大。你像尤其是推荐和是这个搜索,还有那个什么知识图谱这些行业里边。😊,LP里边,然后这些行业里边现在。压力多大呀?他们解决压力的方案是什么?解决压力怎么样去解决?就是这一个工作。

要一个人14个小时才能解决。那么现在这个人的水平的话就是这样,那怎么解决啊,只能招人呢,同学只能招人。只能通过招人来解决。所以说你不用太悲观,你现在。互联网公司也在招人。

而且我我就是刚才给说大家说的那些论坛里边,我有那方面的就是一些群吧,相当于一些微信群。每天群里边都很多很多这个发表的这些什么岗位需求很多啊。大家就是最主要的还是嗯掌握代码能力和这个基础理论。

还有你的项目能力和你的表达啊和主动思考这几个方面还是先锻炼自己的这几方面的能力吧。至于找工作的话,你去试了,你就知道了。你不用害怕,真的这个真的我我没有必要就是就是怎么安慰你,这真的没有那么难。

应届生应届生你更好了。应届生的话,你你就直接去。现在的话,对于算法这方面,对应届生的要求没有那么高。但是的话就是对于你的代码能力的话,有可能会考察的比较多。因为你没有实际的经验的话,相对来说比较少嘛。

即使你实习过你的那个实际工作经验,你工程,包括你的呃你去给别人对需求等等一些东西,你是没有的。所以说是考察你的代码能力会比较多一些。所你这个的话,你最好还是要刷一些代码。互联网行业经济挺好的呀。对呀。

我我一直感觉这个挺好的呀。需要掌握到什么程度?什么程度啊?第一,你把建指offer的那些全敲一遍。啊,你不会的就是第一遍是这样,你把那个建筑offer所有的刷一遍,把你不会的生疏的再敲一遍。

这是建筑offer。然后呢,你把那个le code上面的那个前第一页那个容易的那个可以刷个20道到30道,然后中等的刷个十道,然后男的看一两道okK了。你就去吧,基本上是横扫各大互联网公司了。真in的。

😊,就是如果就是你去呃掌握一些对排序。背包问题正在规划。嗯,维特比等等。你如果把这个讲起讲出来,然后再用代码实现出来。这个。Perfect。😊,基本上你就没问题了。因为太深的同学。太深的东西。

面试官也害怕。因为他在问你的同时,他也害怕你抛出来问题,他不懂啊,这是一个很尴尬的。这找的啥工作?什么找的啥工作是什么意思?没太理解。呃,我我都是一些。被虐回来的一些教训,然后来告诉大家。

我这都是被念出来的教训。然后我直接去面互联网的话,估计就不太合适,越面越得面的越多越自信。对呀,这肯定是。你会在面试当中就感觉。嗯,慢慢的你就展慢慢的你就自己有自己的套路了。然后这个时候的话呢。

你就特别自信,然后去面试的时候。你你就感觉你比面试官还厉害,真的。大家千万不要就是胆怯。禁制offer。就牛客网上有。大家可以看一下这个。这个上面都是基础的题。这个有点太基础了。

这个你刷回来之后那个le扣的你还是要刷的。对,这个强大的内心,这个是。真的是特别重要。面试的时候莫慌。呃,一旦你慌了之后,你的表达啊有可能会受影响,而表达能力也是面试官考察你的一个一项指标。

还有什么问题吗?同学们。我这快要下线了,同学们抓紧时间,有问题的话,抓紧时间啊。没问题。那。祝大家。顺利找到好的工作啊,面算法工程师建筑offer应该不够吧,不够啊。我我刚才说了,那个太那个比较基础。

那是比较那是你必须要掌握的。你在掌握来那个基础上要刷一些let code。这个其实也看你的岗位。和你的以前的工作经历。你如果就是说呃这个呃中级的算法工程师。嗯,如果特别稀缺,有可能就是问到你的问题的话。

就是。建筑offer当中的题。而且还有一点就是。大家在去就是写代码题的时候。最好最好。可以从数学的角度直接给出来一部分,就是说呃一部分。答案。那不应该这么说,不好意思啊,我表达错误。

那个直接从数学的角度去去把这个你的思路讲解出来。这个时候的话呢,你可以让面试官看到你的数学思维能力。这个是是一个亮点。因为我在去听我同事去面试别人的时候,他就感觉哎这个同学可以把就是这个问题。

从从数学的方面,然后给出来呃具体的一个一个一个讲解。然后他就感觉哎这个人真的不错。他就是思考能力也好,数学基础也好,都特别棒。这是他对那位同学的夸赞,真的。没问题了是吗?同学们那。大家晚安。

祝大家顺利找到好的工作。

给弟们再见。

人工智能—面试求职公开课(七月在线出品) - P15:面试绝技 - 七月在线-julyedu - BV1Xf4y1r74s

呃,OK那各位同学,那么我们现在开始了。呃,我想问一下呃,今天来上课的同学有多少是呃会参加今年的校招面试,呃,要参加的打个一。OK那因为今天这个公开课主要是面对应届生的。呃,那么我简单介绍一下我的背景。

就是说呃我是99年就是非计算机毕业的,呃,我是等于是工作之后再开始自学编程的,就是大学里面学过一点C语言,但就属于呃就说只会玩hello word。那么就是说呃之前就是民企外企国企也都混过。呃。

就目前的话就属于那种呃给给这种大老板做做互问吧。呃,另外就是在7月在线上课。那么我基本上就说从游戏,那么以前最早的PS呃PSPS2任天堂M64,然后再到微软的ciQserv数据库到EMC的云计算。

那么然后还有阿里的电商基本上都做过。呃。我是11年在EMC的时候转管理岗,然后开始带团队。呃,从最早两个人的团队,就说发展到1个20多人的团队吧。呃,然后13年的时候去阿里,去阿里的时候又是一穷二白。

又是从两个人的团队就慢慢拉扯到,就是说20人左右的团队。那么基本上从11年开始,呃,我就说每年都会参加校招面试。那么从外企向EMCVMV,然后再到阿里。那么然后每年也都会见不同的学生在不同的地方。

那么就自认为就说也是有过56年校招呃面试经验,也是呃包括笔试面试,都出过题考过人,就另外自己也有比较丰富的被面试经验。那么就是说今天呢也是跟大家分享一下。那么也希望就是大家能在就是说即将到来的面试季呃。

能找到比较满意的工作。那么我觉得就是说面试的第一点呢,就是准备简历。就说我自己的话就是说少说也看着有上千份简历的吧。那么我觉得最大的问题,包括我以前自己也犯着一个问题,就简历做的非常长非常长。呃。

我跟你呃跟你们说,我以前就是我当初毕业的时候中文简历加英文简历,就说有实页就专门装订成册。那么。呃,对,8点钟开始大概讲那个一小时左右吧。就会留出多一点时间给大家相互交流。

那么就说我之前的话就简历做的很长。那么但实际上呢就是呃我自己的话也只看,就说也只看第一页。那么就说我自己看简历的时候看哪些东西呢?就学校的什么不重要,就是说先看你有没有实习经验,那么有实习经验。

那么再看你学校和那个专业成绩。那么再看你在学校里面做什么项目,就为什么看实习经验呢?就如果比如说你去腾讯实习过的话,那么我对你这个人就会比较放心了。那么因为呃就是说腾讯当初已经筛选过一遍了。

那么我可能就说不需要你再去走那个呃笔试和店面的流程,就会立刻就直接安排,就说现场面试,直接放到现场面试名单里面。就所以呃就找一个好的实习就比较重要。呃,那么现在的话呢,其实都这样,都是先从实习开始,呃。

就基本上好的苗子,大家实习的时候都已经收割了。呃,所以呢就就说你如果没有实习的话,比如说你今年大三或者大二第一次找实习,那么你的专业成绩就比较重要。那么因为从我我自己这么多年工作下来的经验。

那么基本上就证明一个观点,高分高能。你专业就排名就说越高的人,基本上能力越强,高分低能呃,很少见很少见,几乎没有碰到过。对,所以你一定要在里面,你如果成绩好的话,一定要突出。

那么这里呢其实是一个非常非常重要的亮点。那么你像就有同学问了,就是我第一次呃我第一次出来找工作呃,找实习,然后也没有什么经验的话,那么你就在学校里面做过什么项目。那么包括你比如说你某些课程呢。

比如说计算机体系结构的大作业,然后计算机什么数据结构的大作业啊,或者一些综合性的大作业啊,就这些东西都可以列在上面。那么包括自己做的哪些事情,用到什么算法,解决到什么问题,就都可以放在上面。

那么就说如果有文体课长就加上。No。那么其他的东西呢,就是说除非或者长得特别帅,特别漂亮,那么往上加。那么别的呢就真心不重要。就学生会什么的话,呃,就如果你是学生会管理层吧,至少就是说学生会主席副主席。

就这个层级再往上加,要不然的话这也真的显示不了管理能力。比如说你什么宿舍的楼什么这种楼长之类的,这种就不需要往上加了。She。那么所以就简历这个东西呢,就是一张纸就中文一份,英文一份够了。

那么就说英文简历呢呃就尽可能的找你专业一点的同学帮你看一下,或者网上查一下,就大家一定要学会就是说用网上的资源。那么有同学就说,哎呀,这个老师啊这个就是那个谷够被强了。那么很多东西找不到怎么办?

就百度的体验不好。呃,就是没有画面和没有这个的同学,你可能稍微等一会儿要刷一会儿才会刷出来。呃,我先回一下那个消息。那么你基本上那么就说有百度,那么百度的话呢。

那么大家其实记住就搜索引擎除了百度和google呃之外,还有一个病病的话,你可以去搜这种英文的信息,就看一下人家这种语言单词该怎么用的。就是你这个东西呢就尽量用词专业一点。

这样就说显得你比较那个就是说稳重吧。那么就简历好了以后呢,就简历。要注意就是说那个一张A4纸,那么字呢尽量大一点,不要塞太多的内容太核心的。比如说你高中哪个学校其实并不重要。那么如果是特别好的。

打个比方,比如说你是在上海上海中学或者是市三女中这种上海一流学中学毕业的,或者是什么天津的南开中学,就这种地方毕业呢写一写,就要不然呢就没必要,就只要写你就说本科硕士在哪里就可以了。呃。

另外学历这个东西呢,征信没有加成。就我说实话啊,就征信没有加成。呃,因为。计算机这个东西呃说到底呢是强一个强自学的专业,就说你你硕士学的东西,就说哪怕我本科,哪怕我高中,就我都可以通过自学,呃。

就都是可以通过自学学到。那么就是说你硕士呢可能多一些理论。但这些理论呢在实际工作当中,就说区别并不大,那反而就说很多就纯理论东西呢都是博士在搞。那么然后在实践层面呢,其实硕士和本科就真心差距不大。

因为呃我以前在那个呃阿里做招聘的时候,包括EMC招聘的时候,那么我其实对硕士和本科是一视同仁的。那么而且硕士在面试表现的时候呢,就并得并没有表现的比本科更强。Yes。因为现在就趋势很夸张。

很多高中生的话他就开始玩编程了。那么基本上呃就是他呃他进大学的时候,他的编程经验已经比很多人强了。因为现在就是据我所知,就国内的一些一线的AI公司已经有高中生在里面去做实习了。She。

OK那么所以就说前面讲完简历呢,那么后面就是一个关键呃,就是要那个刷题。就为什么要刷题?那么有些同学就觉得我概念都懂。哎,我思路都知道,但是从思路变成真实的代码,就真的不是你知道就可以的。

而是要你真的做出来,你才算知道。那么包括我呃很多时候就说去面试的时候,呃,不管是应届生招聘还是社会招聘。那么比如说很简单的,我说呃就链表反转这个东西呢,大家都已经就写烂了,我就不写列表反转了。

我就来一些最基础的数主的题目。He。那么来性数字的题目当中,有些同学就说哎我思路都知道。好,那么你思路都知道,你跟我说一下思路啊,那么你思路说了以后呢,我会追问一些细节地方,就一问就卡,就他没有实现过。

就是临场的话就根本就想不出来,哎,这些细节该怎么办。那么然后让他写代码呢这种语言,就语言本身又不熟呃。其实包括我自己学编程的时候。就我自己学编程的时候,就说我会发现哪我大学时候学过C语言。

但是要让我自己去独立的完成一个程序。哎,我就会发现哎我好像都知道,但是呢就又不知道该从哪里下手。那么其实这个呢就是说明你的训练量不够。那么当时呢我比较幸运,就是说当时我在游戏公司一开始做的非技术的。

那么我当时我自学编程,那么就是有一个大佬就点播了一下。那么然后跟我说呢,就你要是实在写不出来呢,你就先去找一本这种呃去抄人家的程序,就抄了自己调充的再去想一下,那么就说你超过几千行呢。

你就差不多也有突破了。那么所以就说在我这里就说建议大家用me code或者lincode去刷题。呃,这里呢语言不限,就说pyth种C加加Java不限。就你刷题,如果你刷不出来的话,你先去网上搜答案。

搜了答案之后,自己调通了之后,过两天自己不看这个答案,再自己重写一遍,直到这个题目能自己完完全全独立的写出来就OK了。She。就语言这个东西呢呃我建议呢首选python和C加加。

就C加加这个东西就是说虽然很复杂,但是呢就是说呃要多复杂呢是你自己决定的。你可以说我只用那个bo呃,我只用那个STL云器,我不用怎么bo之类牛逼的特性,那么也可以用。

就是C加加这个东西难度上下呃弹性非常大。那么或者就是java,呃,java的好处呢是大多数互联网公司。大多数互联网公司都是要用java作为主力开发语言。那么游戏公司呢会偏C加加多一点。而这两门任选一门。

一般面试的时候呢,我们不对语言做特别特别的要求。那么就首选C加加这个Java。你如果实在不行呢,你跟那个面试官说用python。那么如果你证明你这个用python一样能做的很好呢,那么也没问题。

那么但是呢就是你在那个就是说刷题的时候呢。就一定要培养好一下自己的一些良好的编程风格。也因为就说并不是这个题目做出来就OK的。那么你包括你代码怎么组织,那么咱们怎么工程师的体验上更好,这也很重要。呃。

因为之前我和呃。之前我和乐视的一个副总裁聊过,就他原来是在美国google的,然后他就跟我说的,就他在google的时候呢,就是呃也有很多这种中国小朋友呃,就编程能力非常非常强。

都至少是进ACM就是wordfin的水平。但但问题是呢,就是说实际在工作中的表现并没有就达到他们的期望。那么问题是在哪里呢?就是这些搞ACM的小朋友呢,就过于看重结果。那么过于看重结果,他们手很快。

代码写的很快呃,然后就bug也很少,但有一个很大的问题,就代码的可维护性和可读性都很差,就从工程角度这个代码的实现质量并不高。因为对于工程上来说,效率这些东西是有很多方法解决的。

那么比如说呃对于阿里来说,那么我在阿里的时候也看到过很多烂代码。但这些烂代码呢,就是说虽然效率很低,但是阿里的话可以通过加服务器来解决。就另外效率这一点呢,大家要从两个角度看,就一个是工程效率。

一个是执行效率。那么我们呢就往往就过于注重这个执行效率。那么你在工作当中还要考虑到工程效率。要考虑到就是说你怎么跟人家去做代码评审。你怎么跟人家做代码评审,呃,怎么就是让别人容易接受你的代码。

然后就是说当PM的需求需呃变更的时候,你这个代码怎么去更快的响应,就是这些东西要想的很多。那么刷题呢只是打一个基础。那么就是让你对这个语言的呃方方面面的特性。然后对算法和数据结构就比较熟悉。

那么另外呃比如说你用C加加的话,那么那么要要注意,比如说你这个函数执行完了,或者是这个类在吸构的时候,你要注意要会不会有资源泄露。那么往往这种时候考官就会把问题展开来。哎,你这里有资源泄露。哎。

那你怎么处理哈,你这么处理的话,那么遇到异常的情况怎么办?那么遇到异常情况下,这个堆象又是怎么展开的。那么一系列问题会从一个小的点就说慢慢突破开来?那么这个时候呢,你要能应付,就说后面那一些问题。呃。

关于非计算机的问机的问题,我后面再说。那么刷题呢就说反复刷反复刷。那么我这里呢呃我这里的链接就说是我自己刷着玩的一个记录,就是说我零我自己林特code的刷题记录大概刷了100多道吧。

就目前进度70%左右。大家就说自己刷的时候刷不出来的,可以参考一下。你即使是用java或者是C加加的,你也很容易去改。呃因为我代码还是就大家可以随便看一眼啊。就是我认为就我代码还是写的比较规范。

容易懂的。就说你翻译成其他语言的成本并不高。呃,看不到的同学不要急,可能只是呃因为你网络比较慢的缘故。OK然后刷题这个东西呢,真的没有什么技巧性。那么你就是不停的刷不停的刷,不停的刷。

然后就说刷不出来的话,不要就不要死磕去看答案,就不要有任何心理障碍去看答案,就看了答案,理解人家的东西,那么然后先抄一遍调通的。那么再自己去逐立完成,就千万不要有心理障碍。Yes。

就一开始这个节奏肯定是缓慢的,就一开始你可能半天才搞定一道easy,呃,你也不要就是说有有任何的自卑。就是你一开始可能半天搞到要搞定一道easy。那么到后来可能就是说30分钟搞到一道中等难度。

那么基本上以我的经验,就是你如果是面BAT普通部门的话,那么中等难度左右的题目20到30分钟能独立搞定,那么去应付BAT的面试绰绰有余。呃,包括一般的这种外企。

比如说那个呃微软EMCBMY之类的那当然了,如果你要面什么微软亚洲研究院那个阿里的核心算法团队,你要你目标冲着阿里新这个special offer去的那那这个呢就说你至少也得刷到hard的难度了。

就而且那些级别呢就也不单纯是你呃这种算法方面的问题。那么你简历也准备好了,题也刷了。那么其实就是说开始面试的时候呢,就第一点就是做自我介绍。那么我遇到的自我介绍就说夸张的呢。

就说有把自己从高中开始怎么刻苦学习的,到大学怎么勤工俭学的,然后到怎么去做那个楼掌管寝室卫生的,这个全说进去了。那么这些东西呢,实在是太啰嗦太啰嗦了。那么。因为自我介绍呢实际上是固定的台词。

那么我觉得大家可以就是说花一点时间,就像人家演员表演一样的,就是台上十0分钟,台下十年功,就是好好的就是呃找你同学来模拟一下,就是控制在5分钟。那么然后言简意赅,突出突出自己的优点。

弱点呢你可以不说这个没关系的。但是自己的优点呢一定要突出。那自己的那个强项在哪里?那么特别是你做过哪些你认为是比较牛逼的事情。比如说你在学校里面做一个大作业,那么三个4个人一组,那么你一个人就主挡一面。

然后做整体架构,做那个核心那个程序和或者实现。那么具体内容呢可以到后面面试的时候慢慢聊。那么这个时候呢,就是说给面试官留下第一印象。呃,就你这个人是比较能干的比较聪明的。那么还有一点很专要。

就是降低语速,就练好普通话。就语速快的时候呢,就往往会你的思路跟不上,就降低语速呢可以就是让你呃表达的时候就更从容一点。对有因为有些同学呢我知道他什么都懂,但是他讲的一快呢,他的就是会顺序混热。

会自己一紧张。那么所以就是要排练,然后排练的时候就要控制好速度。那么练好普通话,练好普通话很重要,就特别是呃有些同学。他怎么说呢?就是。就其实都挺好的,但是普通话说的不好呢。

就是说会略微有一些那个这样一些印象风。因为到这一点呢,很多同学都比较忽略,都觉得自己呃技术能力低。因为你到了工作以后。到了工作以后呢,你会发现就是说很多同就是那些PPT写的比你好的人晋升的比你快。

那么为什么?因为到工作以后,怎么跟老板表达你做的工作,这其实是个核心竞争力。所以这个事情没那么简单的事。那么所以这种表达能力呢,实际上要从你大学的时候就开始准备了。那么这一点呢。

我们就是中国学生就非常吃亏。因为像美国学校呢,他们可能呃就理工科不怎么样,但是怎么在公众场合做表达,他们是就从小就强化训练。那么我那个时候跟老美那边交流工作。

那么发现他们的就是应届生就一上台就是信心满满。然后PPT呢明显做的比他们好。就包括我自己到现在也是就是做PPT就是一件很痛苦的事情。那么下面呢就讲一下,就白板编程了。就白板编程这个东西呢。

大家最忌讳的一条就是说一听到题目,马上开始写代码。因为这个时候呢,你其实你不能保证你听到了题目,你就一定理解正确的。那么你首先就是要跟面试官去确认一下题目的条件。那除非这道题目你刷过呃。

你即使你刷过的题目你也要小心一点就。有可能就是呃这个你听上去差不多,但是那个面试官的话,暗暗的在一些条件上就是做了变化就变成另一道题目了。所以这个题目的要求和题目的一些那个边界条件。那么你要小心。

那么确认完了之后呢,不要马上就是不要马上去那个写,而且先把这个程序的框架搭好,就大概先把这个程序的就是实现思路先确定一下。就对于某些题目来说呢。呃,白班写伪代码是肯定不行的。对,但是你可以先写伪代码。

你可以先写伪代码,就是呃把你的思路表达出来。那么表达出来以后呢,有些题目呢其实。你想一想,肯定是有优化方法的,或者你这种标准的实现一定呃不是最优的。但是呢你也不要慌。

那么你先伪代码把这个次优的东西实现出来。实现出来以后呢,面试官一般来说好的面试官都会去追问的。那么说你这里面有优化空间。那么有优化空间呢,它会适当给你一点提示。那么你去那个再去看哪个地方可以做优化。

就如果你实在没有思路怎么办呢?那么你可以先把你的这种做法,就一步一步弄下来,然后说呃你可以说你在哪一步,你觉得这里可能会有一个优化。但是你实在想不出什么优呃优化方式的。那么这种情况呢。

面试官会给你一些提示,一般呢都是会那个比较有用的提示。那打个比方,比如说一个排序数组,排序数组,然后让你找到两个数加起来的和等于某一个值。那么最简单的方法呢就是那个两呃两重循环呃,两重循环总不能找到的。

那么这个时候呢,你如果想不出优换呢面试官就会提醒你说这个数组有序的。那么对于有序数组呢,肯定是前面的小后面的大。那么你就比较容易想到,就是说从一个从前往后变离,一个从后往前变离。

然后看就一次循环能不能就是找到呃这个两个数的和等于某个值。那么然后就是说有了这些之后呢,那么你然后再去在伪代码的基础上,然后再去慢慢的去丰满你的代码。然后但是记住就是你写的时候,就是当你写完的时候。

你一定要确定一下,就是你这个程序有没有什么边界条件。那比如说求最大子数组合。那么在一些极端的边界条件上,那么你是否能满足。比如说那个反转呃反转单列表。那么你对于空面表。

你对于对于只有一个节点的链表和只有两个节点的这种极端情况。那么你是否处理好了。那么或者是做排序的话,那么你对于这种已经排好序的或者是完全逆序的,或者是比如说只有一个数字的,或者是里面有极上等的。

能不能正确处理。就是这些东西都要小心。那么另外就是最后哎你代码写完了,你感觉也对了。那么再跟那个面试官交流,切磋以前的。你最好就是说自己把测试数据。自己最好先列一个测试数据集合。

那么然后把这些东西都跑一遍,那么再去提交。因为如果你没有写那个测试的话,那么会扣分。那么你。写了测试呢,那么面试官就会问你怎么证明你这个测试是完整的。那么这个时候呢,你就要说哎。

我这个测试用例是怎么出来的?因为在实际工作当中。呃,写测试代码是相当大的开销。那基本上呃像电商的好一点呃,测试代码和开发代码的比呃差不多是1比5到1比10吧。但比如说我们以前在微软做操作系统的。

那么差不多我们一行代码要对应6行左右的测试代码,因为我们当时做那个呃windows数据库访问组件。我们当时有100万行的产品代码,但是测试代码写了600万行。就不同的产品不一样。但总的来说呃。

而且现在很多公司的话都把测试团队砍掉了。那么所有的测试代码都要开发自己写。那么你必须通过你的测试去保证你的代码质量。那么所以会做测试,嗯,你测试做的好,那么是一项加分的技能。

那么所以大家平时自己在刷题的时候,比如说呃我在这里找一个例子。

那个就说算算平方的。就是说那个算平方根。那么像这种题目的话,你怎么。就说你不要就写完就提交,就是你要养成一个习惯,就你只你先写测试用力,确定你自己的测试用例都覆盖完整了,你再去提交。就虽然费一点时间。

但对你的能力的话呢,是大大的提高,就要反的话,你是完全依赖于这个呃就是lin codele code这种平台的一个测试集。那么就包括我之前就是说做测试的时候,就发现就是lin code的测试集有问题。

就inter code就是说他的测试集就把我一个错的代码,把我一个错的代码通过了。那么我当时也把这个bug报给他们了。因为你在实际工作里面就说不做测试呢,危险是非常大的。

因为我刚进阿里的时候就遇到过一件事情。呃,当时是一个安全bug,呃,然后他们。知道里面可能有问题,但是他们当时就是说凭着感觉评估了一下,觉得这个问题不大,就上线了。结果上线之后呢。

就迅速演变成一个大问题。那么就是说最后结果就导致呃,当时呃。当时就是他那个负责那个核心交易平台开发的2个P8的人,那个就调离核心岗位。然后就包括呃当时呃。当时叫什么哪个平台,就是一个副总裁。

就说也被就说一个记过处分。对,所以测试这个东西呢是非常重要的。然后包括我们当时在微软的时候有一段代码。Yes。就我们从初级程序员到这种princ级别的程序员就全部review过,然后推上线。

结果上线之后两年,人家报了一个内存泄露的bug。考结果一看,就是当时这个测试用例对那里覆盖条件不足。然后呢,就没有没有去跑那种就压力测试。那么结果呢一个很明显的一个内存泄露就没有看到。

但这个内存泄露呢就比较奇葩,就是说每次呢只只泄露大概十几二十个字节。呃。而且泄入的频率呢也不是很高,但问题呢就是好死不死是跑在人家证交所的电脑上,就说几年不关机的。

结果几年累积下来的内存泄流就非常恐怖了。那所以就是说大家写代码的话,一定要养成自己先测试再提交的习惯,就千万不要就是说把把你的希望寄托在这个就是win codelin code这个就在线欧杰平台上。

因为你在做白板编程的时候,是没有欧杰平台可以用的。She。而且你在做白板编形的时候,你是没有调试环境可以用的。那么所以就是每一步执行下来是什么样的,你要在心里有数,就是你要养成在写明code的时候。

就不依赖于IDE环境,不依赖于这种本地的执行环境,就包括不打log什么,就一定要就是根据呃就是人肉去做排错,就你人肉就争取你要做到什么程度呢?就争取就是说eay的东西。就一类的东西你一遍过。

然后中等级别的,你至少30%到40%一遍过。那么剩下的就根据他的那个欧结的结果,就是两遍到三遍过最多了,就不能依赖于欧结的结果去反复的去做那个改。因为你在工作当中的时候是没有人帮你做勾结的。

然后代码评审只能解决一定问题。Yes。所以大家这个一定要养成好习惯啊,就是你平时在刷le code的时候,你就要当做一个白板编程的一个测试。He。那么就是说一般的话,你如果编程问题解决了之后呢。

那么老板就会觉得哎这个小伙是个可造之才,那么就会跟你聊一些开放性的问题了。那么开放性问题呢,就说平时就是要注重你这个知识广度的积累了,就不要只看教科书,或者只看就说你本专业的东西,就是要多看一点。

比如说呃你写 java,那么你可能就是呃。可能就学得哎比如说那个spring框架,那么spring框架的话,那么你就自然会那个带来一些问题。比如说我这个哎服务的话就告诉我和我怎么去拆分。

那么拆分的话有什么好的方案,那么拆分了之后,那么比如说哎那个可以做微服务。那么微服务有又有哪些问题。那么因为我以前也问过,哎呃,他那么我问他哎,微服务有哪些优点?那么讲的很好,哎,但微服务有哪些缺点呢?

哎,这个他就懵掉了。那么其实很简单,就是说你拆了微服务之后,你服务之间的交互就会带来一个很大的成本。就这些呢你是不需要自己说真的要去撸一遍代码,就是这些你多看多想,其实都能就说慢慢积累起来的。那么。

因为就是我自己以前在面试的时候呢,也也面也遇到过这种完全不懂的问题。因为我最早面试阿里的时候呢,我没有就说面淘宝。我当时面的阿里云,就最后就是offphone没团总没去。呃,就说面阿里云的时候呢。

他们当时问了我一个问题,怎么去设计,有很大的一个问题。就怎么设计1个IM系统,我靠,这个我就懵了,我这个我从来没有写过IM相关的程序啊。那么就说我自己就说凭我以前就说凭我自己的工作经验。

那么就说我尽量把这个问题转述成一个,就是说我曾经见过的问题。那么我提了一个呃架构设计方案。那么实际上呢。那么实际上呢,我这个架构呢是完全错误的,就是说工呃实战当中没有呃没有一家公司是这么用的。

但问题是呢,我虽然是这个错误的架构,但是我这个思路和逻辑呢说的比较圆。那么我就会讲,就是说我为什么做?就这么做可以带来什么好处?就如果不这么做会带来哪些问题。那么这个事实就是结果呢?那么事实结果呢。

就是他也跟我说,就说我这个东西呢,虽然就说大家不用,但是还很有价值的。因为我提出来的所有问题,也都是现在就是做IM系统里面就说遇到的现实问题。所以你对这些东西呢不要怕答错,就是说你这个故事边缘了。

就是你逻辑上说得通。就虽然跟实战有区别,但问题呃就是说但面试官看中的不是说你能把这个问题答对,而是看你这个脑洞大不大。你这个思路是否严谨。那比如说我说我当时做IM的话。

那么我强调就是说呃在你就说完成用户配对之后,那么我要做点对点的连接。那么我就不需要大量服务器去做那个呃消息的中极转发。那么实实际上呢,腾讯和阿里都不是这样做的。就他们不这样做呢,有他们的理由。

但是这种做法呢,你像目前呃有目前来说有一些服务也是尝试着这么做的,就各有各的好处。因为因为你如果大量转发的话呢,你必定就说有一个呃服务器就说要维持两边的轻跳,要去做中转,那么负载和成本呢也确实很高。

就你必须把这些问题想到。因为你因为你的方案可能现在不行,但是在未来不代表不可行。那么比如说现在有区块链,那么有了区块链之后,因为是一个完全去中心化的,那么我我就可能走一个点对点的路线。

或者我可能就是走一个开放游,就这个东西也不是永远一成不变的。呃,就像你就像现在所谓的做那个微服务。那么做微服务就是要搞完以后呢,那么就是现在又开始搞这种所谓的这种服务集群,就是我把。就又往两个方面去的。

一种是说我走服务集群,一种是说我走这种混合服务动态部署,就每一个技术都是发展的。所以你要跟就是你要多看,多看之后呢,当遇到这种开放性问题的时候,你就能把这些东西往你自己呃。

就平时遇到过的这种知识上面去靠上去了。那说比如说那个区块呃那个问了区块链相关的问题,那么你怎么说呢?比如说问你怎么实现POW怎么实现POS那么你如果之前看都没看过一点概念都没有呢。

那么你就是就没法说YY了。就所以就是大家平时。大家平时一定要就是多注重积累。就你光写,就是人家就有这么一句话嘛,就是说代码写的好,半证半到老。就所以你一定要那个开拓思路。因为在实际工作当中呢。

很多时候这些问题呢是没有固定解的。大家就是说开会的时候吵,就是炒哪个方案是最好的。那么。你这个时候呢就是要脑洞够,就说一是就是胆大心细,就是脑洞够大。但是你的推理过程呢就是要细致,这个逻辑要严密。因为。

有些问题不像你在就是说你做那个呃刷li codelin code中勾结,对就是对错就是错。就在实际工程技术问呃,工程技术里面就没有绝对的对错。就所以比如说如果你进了阿里,你你会发现就很多成年老问题。

可能78年前的问题,就每年还要定期拿出来批判一番。就大家还要炒一把,就是说哪个技术范围最优。呃,因为就说你等你工作你们就会明白。呃,这种就是说技术路线的斗争啊,并不是以技术的优劣决定。

而是又背后有很多政治因素掺杂的。那么如果你想爬的更高,那么你其实。要训练自己这方面的能力。呃,因为就对你个人来说,呃,你其实你是要把技术和工程的东西结合起来。那么就政治呢就也政治这个东西有影响。

但不是绝对的影响。所以这方面一定要多多训练,就微博就是微博,还有包括博客上的很多吵架帖,其实还是值得看一看的。就比如说那个之前呃微博上很有名的大漠苍狼的什么前端之争,大家可以去看一下怎么撕逼的。

就是说你看人家撕B的时候,不要去看热闹,要把人家撕B的这个脉络里出来。比如说他攻击哪一点,那么他攻击的这一点到底成不成立,或者是说在哪些条件下成立,哪些条件下不成立。那么如果你来反驳,你怎么去做反驳。

你怎么再去构造这个案例去反驳他的东西。对,因因为你。以后工作的时候,你会发现,我靠测试部门每年能整出一个新的测试框架,前端部门也每年能整出一个新的前端框架。就那么所以就是你要去透过这些东西。

看到他一些本质的东西。就不然的话,你在工作当中就很容易被人家带着走,就带着走的后果就是专都是一般的,但升职加薪是别人的事情。那么这些问题都扯完之后呢,那么老板就是觉得哎小伙子可以继续聊一聊。

那么就往往会问你一些职业规划。那么这个时候你如果想做管理层,或者是想埋头做技术呢,没关系的,都直接说出来。那么反正做应届生就谁也不会当真。但问题就是说,如果你说你想做管理呢,那么就可能会会问你。

就是说你怎么规划你的这个发展路线。那你可能说哎我就说好好的这种学习技术之后呢,就说我要就说呃尝试着怎么去学习管理,就是怎么在工作当中就说体现我的管理能力,然后去争取晋升,去带团队啊,然不道不道这种东西。

你可以说网上的把网上的一些鸡汤加工加工,然后再加上自己的一些理解。就这种时候就是说错也没关系。那么很多时候就考官呢就看你这个人就是这个话说的顺不顺,胆子够不够大。然后就说有没有野心。

那么面试套论呢,就是这些东西也没啥多讲的。那么下面讲一下一些比较忌讳的东西。比较忌讳的东西是什么呢?就是我最怕听到的就是说哎。那个呃就我非常喜欢阿里,呃,我非常想到阿里的工作。那么我到了岸里之后呢。

我一定就说会那个努力学习,来跟上同志们的步伐。我靠no。我我是想你来阿里之前你就已经做好准备了呀。就你你来阿里之前的话,你在学校里面有这么多时间。那么你为什么算法数据结构不好好看一看。

然后那本java核心技术不好好啃一啃,为什么不多写两行程序呢?啊,说非要就进来以后再再去写。那么我跟大家说一个现实的东西啊,就不要看就是说各公司宣传的都很好。而我们有很好的培训制度。

那么基本上就是你实习生进来以后就是野生的,就怕就是说把你扔到一个项目组去,那么就是说死活就看你自己了。但是呢这种时候呢也确实能体现出就是说各各个同学的差距。

那么包括我以前就说我呃有两个这种西电的那个小朋友,本科生,那么上来啥培训也没有的。因为我也比较忙,我就把他们扔到一个项目组去了,结果两个小朋友自己过得特别好,就是说学东西很快。

然后跟那个就是项目组的那些前辈沟通的也很好。那么就样样都好,就结果人家拿到这个微信支付的offer的,而且是开发的offer,这个我就哪也拦不住了。Yeah。那么另外呢就是要看一些经典的教材。

就是说多看一些原版的道。我刚才忘记一点啊,就说我如果你是一面这种测试开发岗位的时候,我最怕听到一点就是说哎这个我代码写的不好,我随一面测试。我靠这个的话我就是直接打个叉的,也就也就不多废话了。

这这个是最忌讳的。说哎我代码写的不好,我做测试,那么我代码写的不好,我做产品经理这个。不能这么说啊。因为就说我以前有一个哥们,他在阿里三年做了三个岗位,第一年第一年做开发,第二年做产品经理。

然后第三年做测试。而且人家是ACM亚洲去拿过前十名的,然后每年绩效考核都是团队排名,就说就说前5%的三年换了三个考核。所以人家是做测试,做产品经理,做开发都是团队最好的。

就是说就没有团没有哪个老板愿意接受次评。那么下面呢就是大家平时看教材,一定要看一些经典的英文教材。就看因为很多中文教材,因为翻译的原因,很多问题解释不清楚。所以你看了之后,你可能还是昏昏然。

因我自己个人有一个非常大的一个体会,就是我之前学呃学C语言和C加加就学的很慢。那么然后就说后来我有一个同事呢就跟我说,你去看那本英文版的thinkkingC加加。那么我发现我靠,我看完之后。

我就觉得好多东西就是一下子就是讲通了。所以大家能看英文就看英文,而且就是说。一般技术类域的输英文呢都不是特别难,你只要记记住几个关键字,那么连盟带拆总归能看下去的。那当然了看之前看一下评论。

那如果评论说哎这本书英文写的很晦涩,那比如说著名的什么effective C加加,more effective C加加事业。这个呢我就建议就是看看中文版算了,就犯不着跟那种很out口的英文去较劲。

那么另外呢就是多看大牛博客,比如说那个韩小阳的博客,还有就是说网上乘那个左耳朵耗子的博客,就左耳朵耗子的博客很杂。但是我觉得呢就是说营养成分很高。那么包括阮一峰的博客,阮一峰的博客也是。

就他的东西呢不深,但是呢就是说对你拓宽知识面很有好处。那么包括左耳朵耗子呢,他有一些那个课程,大家可以去看看。对于我个人就是觉得还是不错的。就虽然他在那个阿里反正有些事情也说不清楚,但是我觉得就是说他。

就是他的文章还是非常非常值得看的。那么如果你做机器学习的话,那么就是看韩小阳的那个博客。

那么最后呢就是广告时间。那么我们求职面试第四期,那么老司机代你刷题,然后包装简历,然后包括指导你怎么参加面试就全有了。

就扫码探看。那么现在呢就是大家的问答时间,那么大家自由提问。那么我会尽量的回答大家的疑问。

啊,另外就是我给大家一个建议啊,就是说你自己平时这种学习的经验总结啊,最好都放到gethub上去。就你有ge hub的话,呃,包括如或者你自己有博客的话,那么就是说会给你加分不少。呃。

实习和正式实习没有区别。那么我告诉你一个不幸的消息,那么招实习生就是按照正式工的条件来的。是没有区别的。就实习生的话会项目上面的东西问的比较少,而是考察基本攻略多一点。那么其他但是标准是一样的。呃。

简历可以的,你到时候就是加我的那个就是加我的那个呃QQ,到时候把你的简历发给我。就我们并不会说因为招实习生,所以我们的这个面试难度就下降。哦,我在群里了。或者你在群里面直接贴出来,也可以。

我会给你一些建建议。gihub上面什么都能放,你可以放自己的那个博客,可以放自己的代码,可以放自己的简历。因为像我的简历都是在github上公开的。呃,博士我没面试过,真的不好说。

但是本硕的话其实面的是一样的。因为很多公司招博士呢,就就博士去做那种工程的网呢,其实比较亏的。就是说你并没有特别的是就更多的博士是在那种理论搞理论的岗位上。比如说像阿里研究院啊这种地方啊。

或者是做人工智能这种地方可能需要博士多一点。马云带起github没问题啊。就只要就只要实现这个功能就可以。马云也可以的。就因为我现在这个肯定家做顾问公司的项目,我们都是用马云的。

就内推的优点呢就是说有个相互信任。呃,可能像阿里的话,我们内推的话一般就是说笔试可以跳的啊。社交有内推料。呃,不会好进一些,因为面试标准是一样的,就最多省掉一些面试步骤。那么可能比如说就把笔试省掉了。

或者是电话面试,只简单问一些情况,就不再多问一些技术细节了。呃,内推这个东西的话呃,因为就是给猎头的招聘费太贵了。就内推便宜。内推即使说1万块一个人也是便宜的,比猎车都要便宜很多。

项目经历和公司方向不同。呃,这个的话关系不大,只要你够聪明就可以。只要证明你在别的项目上做的很好,那么就证明你学习能力强,那么一切都可以重来。测试什么种产品啊,就是说报8个,报很多高质量的bug。

然后不仅报8个,然后还教你要怎么改,就还给出这种修改的建议。就如果你特别帅,那么85分颜值了,那就放。包装经验啊,那么你就比如说你有哪个打过我打个比方啊,比如说你们学校有大作业。

要说要做一个什么图书馆管理系统。那么你就要说呃那么你就包装就是说你完成了架构设计。那么就是说呃你选择了比如说那个就是说spring boot微服务架构。那么你可以说就说你为什么要选个选择微服务。

那么一种呢呃是说你这个特别好。那么还有一种呢你就是为了呃学习这个微服务的这种部署应用开发。那同时就是说了解这个微服务的,在实际应用当中可能遇到的问题。那么你选择这个架构。那么在在实现这个架构的时候呢。

在应用这个架构的时候呢,那你有遇到的哪些问题怎么解决的。那么这样你的项目经验可能其实也就是一个挺普通的一个就是javascreen boot或者是达过的项目,那就被你包装的也就很丰满了。

比特兔交易所做量化开发,就量化开发,其实这个是很宽泛的,就量化开发呢有写底层交易工具的,也有做数学建模的。那么就是看你就是往哪方面去发展了。呃,只想用pyon,不想用java。

这个呃大家千万不要抱有语言的沉见啊,而是应该说就说我是一块砖公司把我放哪就是了。所以就公司用哪个语言,我就选哪个语言。因为因为你想我在面阿里的时候,我对java是一点不懂。那么我是进了阿里之后。

就是就说赶紧就说抱着书现就是现场学的java。没有太多练习算法,这个当然要补了。就说因为是这样的,就特别是很多这种机器学习稿,就面试的时候就特别高大上。虽然进去是搬砖,但是面试这个卡你必须翻过去。

就各种算法怎么呃各种算法的优点确定如何手工推导,你必须去那个做一遍。那么其实跟微软一样的,微软面试的时候面了很多这种数据结构和算法的东西,但其实进去之后基本上没有用过。语言的话呃学个三门最多的就两门。

就是说公司工作里面用的语言,再加一门自己比较偏好的。算法题一般要求不会特别高。如果你像机器学习之类的,就说理论推导要求比较高。因为这个我也是跟韩晓阳老师切磋过呃。就是说你他面试的时候。

理论就是理论推导特别重要。因为就是说你很多时候如果你调参数的话,你没有理论指导的话,就是瞎调。想用C加加做高频交易啊。那么就按据我现在了解的话,就是说你如果用C加做做高频交易的话,那么你C加加。

特别是现在就是呃你其实你要吃的非常透。就你不仅仅是C加加本身,那么甚至包括那个编译器,还有一些汇编层面的东西,你都要有所了解。那么而且现在就是最新的C加加呃时期标准,你也要就是了解。因为C加加这个东西。

那只能说这个坑太深。因为目前我看到的就是说他们是大量的使用bot库。嗯。就是你肯就不不要说什么传统机器学习,就是传统机器学习这个这些东西目前来看,就是20年内或者说至少10年内不过时。

你这些推导都基本功。呃,就天马行空呃,就是我建议你去知乎看一个帖子,就知道这个你就知道C加加这个面试有多大挑战。就查一下,就是说你简历上精通C加加会有什么后果。哎,这个生活从来都不简单啊。

就你不要看那些ACM的人很风光,那么基本上他们都是那种彻夜刷题的。C加上坑太多了,就是说你不死的话,你又不死的。那么你谢尔的PTR,你用谢尔的PTR的话,那么就一堆坑。就那哪些场景要注意哪些问题?

那么什么时候用weP啊,什么时候用sco的PT啊,那么包括C加加时期,它又推出右级引用的概念。那么做右级引用的时候,你要小心什么问题。那么至少就是你如果去面C加加的岗位。

就那本eectC加加more effectiveect c加加和effective modernC加加,就这种这老三篇,你至少看完吧。呃,不是的库里面都提供了,你慢慢看吧。练夹法列夹法简单呀。

就是夹法相关的知识。那个上下两侧java核心技术看完,然后UI方面的扔掉不用开。那么剩下的你就把所有的例代码都啃完,那么就OK了,基本上不会有不知道的问题。呃,这个的话关于机细学习算法的面试。

你可以咨询一下那个韩晓阳老师,你可以去看看他的那个博客也不是特别多。但这些呢就必修课。

我的地我再发一下。就链接都在里面。

就这些链接都只有那个韩晓文老师的链接,还有酷谢的陈浩的那个链接。那有拍子了。那个python你拎的qui刷的差不多就可以了。就python就python虽然有很多坑,但这些坑的话。

一般面试就不会那个就说特别那个在意。我那些企我是慢慢刷,有空就写写,有空就写写。python的话有本身么笨办法学python,然后java的话就是java核心技术,就不要看别的乱七八糟的书。

,这个嘛就很少人在博客呀,就是说机器学习方面的就有很多很好的例子。比如说那个经典的那个踏坦尼克,那么就说从头到尾那个完整的那个推导过程。那么还有一个呢就是那个就是陈号的。

那么陈浩的呢有很多架构设计方面的东西,架构设计。然后呃。

那然后包括你工程实践上的很多东西。

那,QQ号看一下,我QQ号是多少。等一下,我查一下我的QQ号。

我的QQ号是859189803。

对BATTpython档,我不知道是这样的,就pyon这个东西呢,更是用在自己的一些那个实践项目里面。比如说我跟韩晓洋老师交流过,就是他们在实际的做那个机器学习的时候呢,不不会用python。

但是他们在自己就是做日常的数据分析的时候,就对着语言没有限制的时候,呃,会更多的去用python。就如果你是偏这种数据分析机器学习方面的,那么对语言本身的一些特性不用特别在意,只要会用就可以了。

然后你说工程方面的话,那么你对语言本身的一些特性,那么再加上就是说围绕这个语言发展出来的一些呃像设计模式啊,一些呃工程方面的实践啊,你要多了解一点。嗯,行好的,你到时候完点,你简历发给我好。

就尽量发PDF格式。数据分析和挖掘没什么区别。就其实数据分析和挖掘的话,更偏向于商业分析能力。然后你其实里面最重要的呢是做怎么做数据清洗。就是你真的就是这些算法呢,基本上都帮你封装好的。

你只要大概去做就可以了。因为我知道很多这种呃阿里很多所谓的研究院的人做数据分析,那么他们其实基本上一半以上的时间都是在做清理。那么清理完之后的话,那么他们就只要去写写CQ就可以了。

对我就是刷了一课的外企对英语要求还是很高的。就是说面试的话会全英文的。不过现在也比较水了,现在没有以前要求那么高了。但就说外企对应我有要求的阿里什么对应我基本上没有要求。但如果你想转岗去海外的话。

那还是有要求的。OK还有什么问题吗?就如果没有呃。我我觉得可以啊,这个不耽误的。就也有可能工作两年之后,你就不想中国了,或者说工作两年之后,你中国有更明生的目标了,这都有可能。哎,这个不好意思。

因为我只有本科,这个我我不能误人子弟啊。行OK那么我们今天就先到这里。呃,其实后面呢就说大家可以在群里面继续交流。双飞一本呃呃难度不大,是这样的,就是说BATT的话,他在收简历的时候。

其实并对学校并没有歧视。那么你只要通过了你只要通过了笔试。那么其实大家是一视同仁的。因为我因为我团队里面我都招过什么绍兴什么叉叉什么文理学院的这这没关系,你讲能力过的都是一样的。

对测试开发就是对开发的要求。呃,没有什么书籍,就是按按开发的标准来。你网上可以搜一些测试的资料,自己看看就可以了。因为是这样的,就大量的就是手工测试工作是扔给外包去做的。那么就说阿里自己的测试开发。

因为现在技术质量部没有的,那么开发和测试完全合并了,那么就说工作也就不区分什么测试和开发了。那么你所有的人其实标准是一样的。测试的话,你可以去5聊testing。对,虽然就比较水,但看看还是挺长知识的。

社招进阿里啊,就说工作经验了。就说有没有做过类似的项目,然后就说你能不能一上来就干活。就那如果技术不行的话,那么就说你带团队,那么老板就看你能不能帮他完成KPI。校招校招主要看那个基本功。

这个算法数据结构是不是聪明表达能力好不好?呃,你不用在这里刷,你就直接去那个lin或上,就说你基础的就去刷那个easy模式就可以了。你选Ey和那个安全来位的刷就行了。

呃,如果你进了如果你进了就是说4月份上课的这个群,如果进了4月份这上课的这个群,我肯定在的。那么包括那个集训云啊、数据分析啊,python入门啊,这些呃班这些班的群我都在。

然后校招对于跨专业没有什么区别。就如果你是计算机专业的话,可能会多问一些。比如说体系结构方面的问题。那么如果你是跨专业的话呢,可能就是停在数据结构和那个白板编程,就更深入的问题会问的稍微浅一点。

呃,就是说面试的问题会根据你的表现,会动态调整难度的。呃,这个就是说你网上去搜一些人家的经验,这个没这个也没有好的书去讲这个东西。因为书上只讲这个理论。因为你实际当中压力测试这个东西千奇百怪。

你可以看一下,就是阿里云的那个PTS平台。你可以看阿里云的PTS,但这个阿里云的PTS呢主要是针对电商的。你可以参考一下。今天公开课真的没作业,就是那这些博客的话,你自己关注,把里面帖子都看一遍吧。

然后刷题就可以开始刷了。刷机就可以开始刷起来了。行,那今天的课就先到这里了。那么就说希望就是大家开就顺利开启今年的这个面试之旅。谢谢大家。大二的不用急,慢慢来。有的是时间玩的。

posted @ 2024-10-23 18:34  绝不原创的飞龙  阅读(6)  评论(0编辑  收藏  举报