前言的前言
看到自己说过的话,会有一种病入膏肓般的尴尬感在全身蔓延。第一反应是忍不住笑了,觉得这人可真够没脸的,还是算了吧。希望每个人,所付出的坚持和努力,都能变成优秀的习惯,所吹过的牛,都能变成现实。
前言
大家好,我是一名普通的算法爱好者。我希望通过编程的方式给大家带来愉悦和惊喜。感谢 的这一次采访。
欢迎大家。我会不定期在 B 站进行更新。大家也可以通过公众号“的 Code”来了解更多内容。
你现在在分数方面处于最高的位置,大家都对你的计算机比赛经历感到好奇,你是从哪一个时间开始参加计算机比赛的呢?
我在初高中阶段参加过数学竞赛。然而,大学期间我未曾参加过计算机比赛。在本科毕业之时,我还未曾听说过 ACM(国际大学生程序设计竞赛)。2018 年,我开始固定参加 上的比赛,并且撰写题解。之后,我也逐渐接触到了 以及 CF 等其他类型的比赛。我的心态与许多人不太一样,当初接触 时,我的初衷并非是为了面试而去刷题。在那时候, 还是一个较为小众的平台,对我而言,它更像是一个可以进行解谜和做数学题的地方。
(在此不禁想感谢几位朋友,我放在结尾了)
你还记得第一次参加比赛时做了多少道题吗?参加了几次之后能够完成四道题目呢?
第一次完成了大概两三道题,具体不太记得了。参加了两三次之后,感觉自己能做出四道题了。不过因为当时对 C++以及 Java 都不是很熟练,所以时间方面不是很充裕。(当年参加的人数少,可能题目也相对简单一些)
为什么比赛结束后还要花费那么多时间去撰写题解呢?你已经写过很多遍题解了,那么你对自己的哪一篇题解最为满意呢?
我在公众号的文章中写了一句话,我将自己定位为普通的算法爱好者,努力去做娱乐主播,并且争当人民艺术家。当然,说自己是艺术家可能有些自夸了,然而算法实际上和艺术是有共通之处的。我写题解的目的并不是向大家展示我的算法有多么厉害,而是就像看到了一部特别好看的电视剧一样,愿意跟大家分享我的一些见解,只是通过算法题的形式来进行分享。
最满意的题解有三篇:
第一篇是 1130. Cost Tree From Leaf 。当时 Alex 负责所有题解。对于这道题,他准备的是 O(N^3) 的 DP 解法,而我给出了 O(N^2) 的解法以及基于栈的 O(N) 的解法。因为我把这篇题解的思路过程写得特别详细和具体,所以大家的反馈也特别好。
还有一篇题解是关于 877. Game 的。当时有人向我询问这道题,接着我就把原题提交到了某个地方。这道题目并非那种很有固定套路的题目,尽管解答过程较为简单,然而其中蕴含着很多思考的过程。我认为这样的题目更具趣味性。
最后一篇是 1190。每一对,因为所有人的答案都是 O(N^2)的,然而 O(N)的答案其实很容易理解和明白,这需要一点想象力。特别在看过诺兰的新片《信条》之后,我又想起了这道题,推荐一并思考。
你到目前为止大概做过多少道算法题呢?你在做算法题过程中最大的收获是什么?
大概有一千道左右吧(一千以上,在 1500 左右加上一些),然而我认为题目的数量并非关键。当从零做到两百道时,或许在各方面会增长得特别迅速。但从两百道题到一千道题的整个过程中,我感觉并没有特别显著的变化和增长,甚至觉得自己的思路不如之前灵活了,这是因为我已经知晓了这些题的套路,思维也会被这些套路所限制。我在做的过程中,最大的收获并非是思维方面的提升。而是写代码变得更为熟练了。实际上,只要代码写得足够熟练,就能够拥有更加充裕的解题时间,也就无需再花费额外的时间去关注语言的细节问题了。
“你觉得哪类型的题目最有挑战性?”
还有一类我不喜欢的是 NP 的问题,特别是那种用搜索去做的。其实这两类有一个共同点,即只能通过暴力搜索来解决,虽然可以进行剪枝优化,但始终需要探讨所有的可能性。这种题我不太喜欢,我也觉得自己写得不太好。
(等于没有的题目,最有挑战性)
我刚开始接触的时候,它在排名第一的位置上处于遥遥领先的状态。我从始至终都未曾想过会有人能够超越它。然而,你现在却超过了它,成为了第一。那么,你做了哪些与其他人不同的事情,从而让你成为了最高分的用户呢?
第二,我对自己答案的质量要求较高。首先,我会确保答案一定是正确的,一旦发现有错误的地方,我会及时进行修改。首先,我会查看所有的回复。然后,依据回复对答案进行更新。我每天收到的回复数量可能比赞的数目还要多。最后,我会尽量给出多种语言的解法,例如 Java 和 C++。
(我有你们,感谢你们的支持。)
在某个方面排名第一对你的职业发展是否有帮助呢?在工作过程中,你亲自参与的最具挑战性的项目究竟是什么?
好像没有这回事呢。我未曾向周围的同事提及过,他们也不太了解。我觉得兴趣爱好是能够由自己去选择的,然而工作方面却没有那么多的机会能让你凭借爱好去进行选择,更多的时候是要把一件件事情做好。所以我并没有如大家所想象的那样,参与了火箭的发射,也没有制造出一个无人车。我身为程序员,在工作里真正用于写代码的时间或许仅仅占 20%,其余的时间都在处理别的事情。
(20%略夸张,与人沟通协调,也是程序员的职责。)
以下这个问题是人们最想知道的。当你面临算法轮时,如果在简历上写上你的 ID,面试官是否会比你更加心虚呢?
我在简历中没有提及我的 ID,在面试过程中也没有提及我的 ID,所以他们应该都不知道。
当你担任面试官时,你是如何去判断这个面试者的能力呢?若你看到他的竞赛成绩很好,会有特别的方式来对他进行判断吗?
我会更注重他的整个思考过程。我不会一开始就出一道难题,让你一直做不出来。如果做不出来,我会接着给你几个提示,希望你能在我的提示下,一步一步地做出来。这样至少能让我看出,要么你准备得很充足,做题很充分;要么即使你什么都没背,也没听过这个算法,但给你一点提示,你就能有能力进一步探索。我并非计算机竞赛科班出身,我所在的公司也未对竞赛选手特别重视。面试官很少会因为你是竞赛选手,就一定要出一道难题难倒你。不会有这样的心理,大部分人还是会出一道很正常的题目,期望你能比较熟练地做出来,并且能够很清楚地与面试官进行沟通。
你认为现在使用算法题进行面试的效果如何呢?你有没有关于改进面试流程的建议呀?
我认为现在的这种方式挺好。其一,它很有效果;其二,相对而言比较容易准备。大家都觉得大厂的考察门槛通常比较高,但我们公司考察的内容相对来讲会更清晰。有些公司会询问许多细节方面的东西,却不拿出一个具体的问题,这对于刚毕业的程序员和有一定经验的程序员来说都不太好准备,然而算法实际上是特别容易准备的。有一些国内的公司,未必是互联网公司,它们的标准是看你的第一学历,即你的本科学校所在地。它们称没有找到比这更有效的方式了。与它们相比,我觉得我们做算法题特别人性化,至少还可以通过努力去达成。
有些公司在面试时会考查特别复杂的数据结构,比如手写平衡二叉查找树;也会考查以人名命名的算法,像 Prim 算法。那么,这类题目应该怎样去准备呢?
解算法题时,我大多使用好用且现成的东西。对于一些特殊的数据结构,我也没有特别深入地学习过。然而,这些知识点你需要大致明白其原理。现在这家公司电话面试期间,我遇到了一道线段树的题。这道题的好处是,即便不使用线段树,也能够得出一个次优解。我是在写完次优解之后,才去撰写线段树的解法。不过,我并未将线段树的解法实现出来,只是假设存在这个 API,并把原理解释清楚。我认为面试官不会仔细查看你每行代码写得是否正确,更多的是:其一,你要知晓原理;其二,你能清晰解释;其三,你会加以运用。这三步或许远比你能够将代码一行一行写出来更为重要。对于有名字的算法,偶尔碰上一次,你或许不会在意,但如果碰上两三次,你就会主动去研读,在理解之后就能将其转化为你自己的东西。大部分面试如果考一个有准确人名的算法,通常是一道非常直白的题。这既不是难点,也不会出现在你的瓶颈期内。
-
你做题时有没有遇到过瓶颈期呢?比如有一道题,即便已经做过好几遍了,可过了一段时间后,却发现还是不会做。那么,遇到这种情况应该怎样去突破它呢?
我曾遭遇过瓶颈期,到如今依然如此。有许多题目,我一看便知自己不会做;还有一些题目,我觉得自己会做,但就是怎么写都写不对。实际上,每个人的瓶颈期差异很大。我认为大部分人是练习不足。但最起码,你要先达到一个高度,即能够用代码将脑海中的思路实现,这就已经很了不起了。要突破瓶颈期,我建议多看看别人的解法,了解别人是如何实现的。如果觉得自己很接近且能够解决,那就花时间去写,但这样会花费更多时间。其实 Alex 也说过,上面有很多不够好的 DP 题,我对此表示同意。不过,当动态规划积累到一定经验后,是可以克服这些问题的。而一些栈的问题反而更难想出来,需要花一点苦功夫。
你的心态与许多程序员不同,许多程序员会以面试的心态去做题,因为很多公司考的都是上面的题,你对此是怎么看的呢?
这个东西如同应试教育。以前在高中时,有的人特别喜爱数理化,然而却未必能将其做好。有些人做这些的目的仅仅是为了高考,并非追求深刻理解,可分数却能考得很高。我肯定不会对他们进行批判,这其实是很正常的现象。不过,很多人会问我怎样才能把算法这件事做好,而我无法给他们一个令其满意的答案。我心里会想,是不是因为自己做得不够好,才没给他们一个满意的答案,让他们觉得我有技巧却不愿意告诉他们呢?但实际上并非如此。很多人都想从我这里找到一个捷径,然而我无法给予他们。我通常会跟他们说,其一,有一部分人实际上是练习得还不够,功夫还没有下足。第二,我觉得他们对这个事情不感兴趣。倘若一个人对某件事情不感兴趣,那么他也很难将其做好。
有的求职者刷了大量的题,然而面试时表现不佳,你认为他们缺少的是何种能力呢?有的人或许仅仅刷了两百道题就成功进入大厂了,你觉得背后的原因是什么呢?
很多人在面试时会说自己刷了多少题。然而实际上,从两百题到两千题这个过程之后,他们可能只是在机械地做重复的事情。做题的数量并不能反映出一个人的水平和能力。每个人做题都有各自不同的方法,有的人数学基础很好,或者特别聪明,这样他们就能很快做到举一反三、融会贯通,从而顺利通过面试应试,之后再把精力放在其他事情上。有些人学得没那么快,我认为就应勤能补拙,需下苦功夫。算法本身其实没想象中那么难,比高考还简单很多。只要你花时间去做,就能做好。做题厉害与否和工作能力不一定等同,因为解题是很简单的任务,它会把所有限制条件和输入都告诉你,你只需填几行代码就行。而且进大厂不能说明有多厉害。我知道有很多人水平并非很好,但却进入了大厂。面试这件事肯定包含一定运气成分。不过你之前的努力都会提升你成功的概率。算法能力一直伴随你,你具备这种思考能力后,以后能应用到其他地方,不仅可用于刷题,甚至在工作或下一次跳槽时也能用到。所以这些努力都是值得的。
面试在一定程度上是很依赖运气的。人们一直满怀期待地等待着能够顺利进入大厂面试,然而最终却发现,还不如喝上一瓶雪花啤酒,去勇闯天涯。
“你怎么看待现在是市场上涌现的算法培训班?”
程序员通过花钱上课,能够迅速知晓这些东西该如何去做,进而获得大厂的工作机会。我认为这样的投入是很划算的。因为程序员,尤其是在北美地区,每个月的工资都较为可观。并且对于北美的应聘者而言,尽管拿着北美的工资,但在全球范围内的学习成本是相同的。另外,从算法班的角度来看,他们依然能够赚取不少钱财。我觉得这件事情很不错,自己看着也很是羡慕。
你是否有开办算法培训班的计划呢?有很多算法培训班联系过你让你录制课程吧?
我做算法题起初只是出于兴趣,并非为了赚钱。之前我在算法群里曾与他人轮流免费讲课。然而,我从未大肆招收学生,也未曾利用自己的名声四处敛财。若有一个特别好的契机,开培训班是没问题的,一对一教算法也是可以的。联系我录课程的培训班数量不多,我也未主动联系他们,他们不缺老师。算法大家都会教,不同老师教的侧重点有差异。听我的课和听别人的课,对学生的帮助会不同,这个区别很微妙。
(大概还是,水平有限...)
如果你认为要让中国在编程世界更具影响力,那么是否应该让更多人看到国人的项目或视频呢?比如给你的视频加上英语字幕。或者说这其实并不重要,只要乐于分享自己的知识就可以了,我看到你也在帖子里鼓励其他人去学习中文。
在我的频道之下,有许多人让我制作英语视频或者添加英语字幕。他们表示这样做的话,肯定会有很多人来订阅我,我的粉丝数量会大幅增长。然而,我最初创建这个频道的原因并非是我想要走红,也不是为了成为一个 Up 主去赚钱。最初的原因是我用英语写文章时,解释得不够好。用中文进行解释有时能展现我整个思考的历程,这样说起来更自在、更贴切,还能给大家带来欢乐。然而,当下我身处家中,视频都不一定能制作出来,要是再用英文,我已经觉得很疲惫了。倘若还要加上一个英语字幕,我觉得自己不会去做这件事。
现阶段,由国人开发和维护的开源项目数量相对较少。其中最为出名的要数 Vue 了。那么,该如何去鼓励年轻的程序员参与到开源项目中呢?
这个问题规模较大,仅靠我一人难以解决。其中一个原因或许与竞争有关。中国有众多程序员,大家连温饱都尚未满足,要花费时间去做社区就比较困难。在这方面,我们可以参考印度人的做法。我认为很多印度程序员,暂且不论他们的水平如何,他们无论做什么事都倾向于创建一个网站或撰写一篇博客。其实我有时觉得他们写得并非那么出色,但他们却对这件事极为喜爱。时常有一些人在我的那个帖子下方贴上他们的链接,还说如果不明白就来看我的视频。他们在宣传自己方面挺有一套,我认为这是国人值得学习的地方。
你可以给大家推荐一些关于算法方面的学习资源吗?
我没有看过太多算法书,所以无法给你推荐算法书。但是,我可以给你推荐很多有趣的数学书,比如《从零到无穷大》。
(推荐已经有一些算法基础的朋友看我的)
“你自己的偶像是谁?例如名人或者科学家?”
这真的很难去选择呢。通常我会说我喜欢杨幂。哈哈哈哈,她是北京大妞呢,我觉得她的性格挺爽朗的。
“如果可以随便选世界上任意一个地方,你会想去哪里工作呢?
如果不考虑身份政治和安全问题,我愿意一直在美国工作。美国的机会众多,项目丰富。在待遇方面以及 Work Life 方面都更具优势,这些方面都很重要。我也认真考虑过前往日本、新加坡或者欧洲工作,人生体验是很重要的。除了个人发展方面,偶尔更换地方和环境都是很不错的。
(世界那么大,如果能不工作,去哪里都可以。)
“如果可以重新选择的话,你会有不同的职业规划吗?”
如果能重新选择,我或许不会选择学计算机。本科时我原本打算学经济管理,后来阴差阳错才学了计算机。我觉得数学物理能够指导整个客观世界,而经济学则会研究人类社会的一些决策和规律,我觉得这很有意思。即便不学计算机,也可以做算法题,因为只要会编程就行,不一定非得是计算机学院的。
其实我高中时想成为一名体育老师,并且能够担任班主任,为生病的数学老师代课。
“有什么其他建议给你的粉丝以及我们的读者吗?”
算法只是程序员面试的一部分。如果喜欢,我觉得可以多做一做。我也比较喜欢和志同道合的朋友交流。如果只是把算法当成敲门砖,就找认为最有效的方式把事情搞定,不用在意别人做得比自己好,应该多下功夫。给正在读书的读者的建议是别读研究生。我曾经读过研究生,这可以说是我曾经走过的一段弯路。在职场中,研究生与本科生在待遇以及其他方面,通常不会有特别大的差别。与其花费两年时间去读书,不如本科毕业之后就直接去找自己喜欢的公司,这样工作两年所带来的收益,可能会比读两年书还要多。
去美国读研究生以及通过研究生转行是有意义的,此情况不包括在内。无论做何种选择,都不算弯路,只是一些路途较远,能看到远路上的风景。
感谢
最后添加了一个感谢环节。朋友在我的算法旅程中,对我产生了很大的影响,他们见证了我从一只很稚嫩的“菜鸡”逐渐成长为一只成年鸡。
感谢一言学长。有一个经典投票问题,就把它当作饭后甜点来享用,感觉十分满足。学长的一句话,让我如醍醐灌顶,非常完美地向我诠释了什么是算法。只可惜没有好心人早些引荐,让我与学长相见恨晚。
感谢耗蚊弟弟,他带我认识了 LC 的周赛,让我知晓原来大法是会被罚时的。并且让我明白了什么是 dfs/bfs 。到如今我依然觉得 dfs 和 dp 差不多是一回事。人生在世,知音很难遇到,有机会的话早日带你在 dota 领域达到超凡入圣的境界。
感谢你默默替 LC 背负了无数的黑锅。别人时常问我关于算法看过哪些学习材料,如今回想起来,你所写的非常好。我很想念一起玩游戏的那些日子,不多做赘述了,反正你也看不懂中文。
感谢慧峰法师,他鸽了我们第一次的约定,我才获得了历史最佳成绩。众口难调是客观存在的现实,你通过行动向我表明,唯有保持刚正不阿的品质,并且做到能者多劳。曾经我们一同跨越了山和大海,而现在我独自越过山丘,却发现没有人为我等候。
感谢,我看到青山那般妩媚,青山看到我想必也是如此。你就像是行走的算法辞海,为我提供经典的依据和事例,我觉得自己还有被挽救的可能。即便有十倍的天赋,也还可以付出百倍的努力,这一点比什么都更有价值。青山依旧,绿水长流,远方的祝愿就不多说了,祝你在秋季赛中获得前三名吧。
有缘人数量众多,其中还有零、一、二、三、四、五这些数字所代表的人。我期待着在未来能与你们有更多的相互接触和关联,在此表示感谢。
工作时间:8:00-18:00
电子邮件
扫码二维码
获取最新动态