找回密码
 立即注册
楼主: NoiseFloor

为什么有人说弄懂了《算法导论》的 90%,就超越了 90%的程序员?

[复制链接]
发表于 2021-7-3 22:34 | 显示全部楼层
学习算法,切忌一上来就啃《算法导论》,我宁可你看的是 《Cracking The Coding Interview》。
不是算法导论不够全面,更不是写书的大佬不够牛逼,而是因为面试算法≠算法!  
我在《九章算法班》上提过面试算法和算法的五大区别,让你脱离只会刷题的“高级趣味”,目前我已经帮助500+人拿到心仪的offer!
准备算法面试,要学会功利的刷题

很多人会选择看《算法导论》这类大部头,或是疯狂刷题来提升编程能力。但是《算法导论》全书共1180页,LintCode则是搜集了2000道编程练习题,假设我们一天能刷5道题,1年多就能刷完了呢~
所以,我整理算法和数据结构的常考知识点,越红考得越多,灰色的不考或是考的概率小于千分之一,直接帮你筛掉一半以上的编程题。
展开来说一下:
①字符串处理:考得很多,主要注重代码实现能力,算法上没有太多难点,通常是处理麻烦。
双指针算法:高频算法之王,变形特别多,算法不算特别难,但能快速想到和写好不容易。
二分法:考察频率中等,能写好写对不容易,二分答案的问题甚至很难想到算法,要背模板。
分治法:考察频率中等,一般和二叉树一起出现和考察,题一般不难。
动态规划:国内大厂基本都考、北美主要是G/F喜欢考,其他公司考得比较少。
拓扑排序算法:考察频率中等、但每个公司基本都有一个这个算法的题。
链表:中小公司考得多,大公司近年来考得少,题目一般不难,主要考察reference。
堆:高频,经常会用到,原理必须掌握,但不用掌握代码实现,应用必须掌握代码。
树状数组:不太考,与其学这个不如学线段树。
红黑树:只有G可能会问到,也只是问大致原理,能干啥,Java会用TreeMap就行。
更多算法和数据结构的考察情况,可以移步我的讲座《FB面试官揭秘算法面试速成技巧 - 怎样做到 Bug Free 和刷100题等于别人刷300题》,我会在讲座中跟大家具体分析。
代码通过了,也不要忽视代码质量

代码就像一件艺术品,越是高级的程序员,越有代码洁癖。越是高级别的面试官,越在意你的代码质量。拥有好的代码质量,会让面试官在心里为你默默加分。如果质量很差,面试官会在心里为你默默扣分,最终是否导致 Hire / No Hire,就是一个量变引起质变的问题。
在刷题的过程中,不要觉得代码通过了就一劳永逸了,还要注重提升代码质量。我这里抛砖引玉提几个:
二元运算符两边加空格,单元运算符不加空格
花括号和 for, if 之间要加空格(Java),圆括号和 if 之间要加空格
用空行分隔开不同的逻辑块
逗号后面加空格
把面试官当做你的Partner,学会正确沟通

把算法学得炉火纯青,也不能保证你能找到工作。其实在招聘市场中,用人单位更愿意招一个各方面能力都比较均衡的“普通人”,而不是一个编程能力逆天,却难以沟通交流的“天才”。
在面试中,你要学会把面试官当作 Co-worker而不是考官,让面试官愿意和你一起工作。
我总结了一些面试tips:
①做一个题之前,先沟通清楚,得到面试官肯定,再开始写代码,写完以后再解释
②不要闷头写 也不要一边写一边解释太多(容易写不完)
③可以要提示,经过提示做出来的题,也是可以拿到 Hire 的,但是先自己努力想一下,别太容易放弃,容易让人觉得不会主动思考问题。
④别和面试官吵架。面试官带着答案来面试你的,不同意见在大部分情况下,都是你自己想错了。
⑤会就会,不会就不会,不要遮遮掩掩,坦诚很重要,容易让人觉得和你沟通“不顺畅” 。
⑥做过的题就说做过,不要故意说没做过。因为他既然已经怀疑你做过了,即使你说没有,他也无法打消这个顾虑,还不如让他换题。
通过实践,不断提升自己的算法能力

接下来就是一个理论指导实践的过程。在你学完了《算法导论》等理论知识后,应该主动去实践,不断提升自己的算法能力。
首先,多刷题。在刷题的过程中深入理解算法和数据结构。
LintCode是一个程序员刷题网站,覆盖了近2000道企业面试真题。在学完一个知识点后,可以及时来刷题巩固,提升自己的算法能力。
其次,学会总结思考,才能扛住面试官的follow up。
很多人觉得自己刷完题并通过了就一劳永逸了,然而在真实的面试场景中,面试官会抓住你代码的某些点来进行提问,如果没有及时进行总结和反思,则很难通过面试。给大家一点方向:
思考写出的代码还有没有优化的空间。比如变量命名是否规范、空格是否对齐,代码能否更简洁。
思考是否能做到一题多解和多题一解。比如这道题用了二分法,是否能用DFS;A题的DP解法,能否用在相似的B题上。
找个人帮你mock,学会站在面试官的角度思考问题。
做好面试前的准备,学会看菜下碟

很多人会问我:“去BATJ等大厂需要刷多少题才够?”,实际上不同公司和岗位对算法面试的要求也不同,有针对性的准备才是性价比最高的方式。
按公司面试难度刷题:
①像是字节、美团、Google、微软这类竞争激烈的公司,必须要刷难题。算法考察范围很广,特别喜欢DP和红黑树 Red-black Tree,线段树 Segment Tree。  
②其他一线大厂,比如腾讯、阿里、Facebook刷中等题就够了。
③其他中小厂,比如搜狗、爱奇艺、蘑菇街,刷中等题就够了,算法面试考察范围很窄,Binary Tree, LinkedList, String, Array 这些基本数据结构相关的题掌握即可。
按岗位面试难度刷题:
不同的岗位算法面试难度不同,越后端越难,越前端越简单
难度排序(从易到难):
Data Scientist / Data Analyst / Data Engineer
Web Frontend Engineer / Mobile Engineer
Software Development Engineer
Product Engineer
Infrastructure Engineer / Software Reliability Engineer
Machine Learning Engineer  
关于算法面试的方方面面,我在《九章算法班》里讲得很详尽了。现在还开放了前四节体验课程,感兴趣的小伙伴可以来免费试听。
最后,我整理了2020年大厂高频面试题,感兴趣的小伙伴记得收藏。
阿里巴巴:
牛牌
连接字符串
同和分割数组
有效的括号字符串
路径和
数组评分
字节跳动:
删除字符
矩阵中的最长递增路径
恢复数组
食物组合
组合新数字
最大点的集合
腾讯:
最短休息日
解压字符串
中位数
移除箱子
最小分解
歌曲时间
百度:
等差切片
祖玛游戏
生命游戏
字符至少出现K次的最长子串
整数替换
拆分子数组
美团:
考试策略
字符串划分
区间极值异或
月份天数
关联查询
字符删除

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-3 22:40 | 显示全部楼层
这话其实是不准确的。
真相是,如果有人弄懂了《算法导论》的90%,就超越了99%的程序员。
其实对于大部分技术书,包括教科书,大部分人只能学透前几章,真的,你回忆一下大学时代上的课,是不是最后几章老师也是在学期结束的时候草草一带而过?你回忆一下你最近读过的技术类书籍,是不是没看到最后一章也就放弃了?你也不用责怪老师,你也不用责备自己,这都是正常现象,因为,书越往后越难,越往后面的章节越是那些不常用的知识。
对于《算法导论》,这样一本其实很多程序员可以了解、但是又不会实际用上知识的书,绝大部分还在编程这碗饭的人都没有读完过,我就没有读完过,我读了不到90%,更不要说弄懂90%了。
我自认为水平超过了99%的程序员,你如果读懂了《算法导论》,真的可以算超越了99%的程序员。
不过话说回来,什么叫做『超越』呢?
是编程能力超越?
是算法能力超越?
是赚钱能力超越?
是表达能力超越?
还是杨超越?
我只能说,毅力超越,你能读懂《算法导论》90%,毅力上真的超越了99%的程序员,但是并不保证你更懂编程、更懂算法、更懂赚钱、更懂表达,这些都是其他维度的东西。
所以,你要是没完全读懂《算法导论》,也不代表图灵祖师爷不会赏你饭吃。
发表于 2021-7-3 22:41 | 显示全部楼层
    理性的回答:这是扯淡! 现实的回答:说的没错。 “哲学”的回答:这重要吗?
【理性版】

理性来看,这话显然不靠谱。
且不说何种程度算是“弄懂90%”、“90%的程序员”又到底是多少人,就单说这个“超越”二字就没法具体量化。要是这么说:
能完成《算法导论》上90%的课后习题,月薪可以超越国内90%的程序员。
那我觉得倒也算是可以评估一下。而按现在这说法,完全就是喝酒撸串吹牛皮时候的一句车轱辘话。
换成我说:
能在上海马拉松跑完全程的90%,就超越了90%的程序员。
是不是也没啥毛病?
【现实版】

但是!
抛开这句话的精确度,仅仅当做一个“程序员进阶指南”来论,这么说也有它的价值。如果你真能“弄懂”《算法导论》的90%,或者退一大步讲,能好好把《算法导论》啃一遍,明白书里说的内容(不是像看小说一样仅用眼睛“看过”),把代码都尝试自己写一遍,在广大程序员届不说 90%,也必定是 above average 的水平,而且绝不仅限于算法这个层面。
别看知乎上人均大厂P8,但在我面试过的程序员里面,真的有差不多90%,连“两种方法输出斐波那契数列”都无法完成。(当然你可以嘲笑我们小公司太低端,但相比大厂,这才是程序员人口最密集的地方)
【哲学版】

但但是,即便如此,我依然不明白这种问题的意义在哪里。
是因为发现有同学在啃算法,且下了这么一个结论,你很不屑,想要反驳?
还是因为想要发愤图强,死磕算法,又怕自己走了弯路?
或者是ETC附体,就纯抬杠?
恕我不客气地妄断一句:大多数执着于这类问题的人,估计连《算法导论》的9%都没有看过。
计算机技能是个网状结构,不是线性结构,要想进阶,必然是多个相关技能点都得去花时间点上。而且这个过程是反复的,迭代式的。完全不存在一个 1->2->3 简单学习步骤,照着走完就 OK 了。这是系统性的知识体系学习,又不是流水线操作培训。
况且《算法导论》绝对谈不上是一本新手友好的“入门书”,我从未见过有哪个程序员能做到其他技能很拉胯,唯独把算法啃得津津有味的。
但往往很多刚踏进门口的初学者,被前面复杂的路线给吓住了,于是转而寻求一种“攻略”式甚至是“秘笈”式的学习路径:能不能有一本书、一套题、一个教程、一个培训,我只要把它练好了,就如同练就“10级野球拳”一般,横行天下了。
抱歉,
非要说有什么简单的路子,那也就是不停地写代码。别说是《算法导论》,就是传说中的《谭浩强》,你把里面90%的内容真的弄懂,也都能碾压一大票程序员了。
话说回来,假如现在知乎er告诉你,就算弄懂90%的《算法导论》也不能成为程序员里的杨超越,难道你就不学算法了吗?
又或者等你闭关修炼,终有一天达到90%算法熟练度,却发现自己竟没有打败90%,仅仅成为了一个平平无奇的大厂P8,难道会大呼上当,痛骂那个教唆你去看《算法导论》的人吗?
显然这也都是:
你只要知道,算法是个好东西,程序员多学点算法没坏处,《算法导论》是本好书,程序员多看看没坏处。那就足够了。看90%有90%的收获,看50%也自然有50%的收获。就算有人看了不到1%就发现无论如何也看不懂、看不下去、不想看,那也至少证实自己不是这块料不是嘛【手动狗头】
所以就一句话:但行好事,莫问前程。
通俗讲:干就完事了!
翻译成英语:Just Do IT!
----
最后分享一个我个人的经验,可能不那么切题,但希望能给其他人一点启发:我以前上学时候很想做游戏开发,但我发现这行有好多东西要学,光引擎就有一堆,完全不知道从何入手。加上我当时的想法不仅仅是做一个程序员,而是可以主导游戏开发的人,所以更不知道从何入手。于是花了很长时间在寻找所谓的“最合理的”学习路径上。
直到后来有一次看到国外某个游戏设计师说:你想成为游戏设计师吗?别一上来就想着学这个学那个,然后你就能做出牛逼游戏了。我给你一个简单的办法:去做100个游戏。等做到十几个的时候你会有一点感觉,做到差不多50个的时候就可以有“自己的声音”了,做到100个的时候你就成为真的游戏设计大师了。
我当时也找不到什么更合理的方式,于是也就照做了。不过至今我也没做到100个游戏。因为当我做到11个的时候,就进了Ubisoft;第17个的时候就有自己的独立游戏挂游戏网站上赚广告分成;第20个游戏就已经是带领团队做手机游戏了。
虽然我现在已经不混游戏行业,不过这个过程在我之后做很多新方向的时候都有着影响:别想那么多,只要大方向没问题,坚持做,该来的迟早会来。
至于你最开始走的是不是一条笔直朝向终点的捷径,一点都不重要。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-3 22:51 | 显示全部楼层
这个数字,其实都算是保守了。
实际上,弄懂了这本书,已经可以华山论剑,笑傲江湖了。
<hr/>笔者大学,211、985,双一流。
算法导论课程的教授,是我们学院副院长,另一个系的系主任。期中,实验作业就是实现各种排序算法,这个大作业,就已经拉开档次了(当然,也和大三了,有些同学开始心散了有关)。
大家可以翻翻书,看看那这些排序,在这本书里究竟是和什么段位。
<hr/>笔者现在,是公司某核心引擎负责人,带团队的。
在校招工作中,笔者负责二面。这里可以展开一些不涉密的信息:笔试(现在是在线答题)会筛选一部分;然后是一面,纯技术面试;接着是二面,项目为背景的技术面试;最后三面,就是跟hr聊天了。
笔者遇到的甚至有双一流院校的硕士,时间复杂度搞不清楚的,这样的情况,真的就很尴尬了……基本概念啊,拜托!!
<hr/>举一个具体的例子。
因为涉密关系,具体背景不说了。
当时,对方是一位硕士,双一流的,本硕都是同一个学校、同一个学院,计算机专业科班生。可以说,看到这种简历,我们就基本确认了。
然而……
实际面试,令人失望……
当时,笔者还仅仅是负责一面。
笔者提出了一个场景,预期答案,是一个时间单位,对方给出的答案,是nlgn,这个差异,完全就应该淘汰了。
因为是双一流的科班硕士,笔者动了“恻隐之心”(集团面试官有这个权利),追问了对方提出的算法的时间复杂度,预期是在这个基础上继续提问,挖掘对方进行算法优化的。结果,对于算法复杂度的回答,就已经“脱缰”了,最终面试结果,可想而知。
<hr/>说白了,目前计算具行业(包括软件、互联网)很杂。
同样都是IT,有的团队只是皮包公司(或者,说是团伙更贴切),有的团队,却绝对正规化。
而即使是正规化的队伍,因为业务导向不同,算法刚性需求也截然不同。
比如,论坛网站的程序员。论坛做的再大,对于这类程序员而言,说白了也就是网站维护,专业的算法能力的需求上限,相对来说,是很容易达到的。
与之相对的,是有些“传统”的纯软件公司,比如语音识别,比如安全……
在这类软件公司中,业务的专研,甚至可能是终生的。说什么三十岁危机……可能,对于算法研究,拼搏到了三十岁只能勉强初窥门径。
以笔者岗位为例,笔者团队中的一位老大哥,是“黑白手机”年代的程序员,要是不理解,在进一步告诉你,这位前辈,是笔者父亲那一辈的人。2020年年初,因为没有健康码的问题,这这老前辈费了很大麻烦……但人家老前辈业务能力过硬,危机?新人能力不行,达不到我们的技术要求才是危机(要不然我们团队的继续发展可能就要后继无人了)。
<hr/>算法导论,要是真的吃透了90%,放心,绝对一大堆人挤破脑袋也要抢你的。
发表于 2021-7-3 22:51 | 显示全部楼层
这类话是最好说的
公式:弄懂+一本名著+百分比+超越+百分比+你的群体。
例句:
弄懂sicp的67.9%,你就超越了95%的程序员。
弄懂本草纲目的72%,你就超越了93.7%的中医。
弄懂冰箱说明书的83%,你就超越了99.9%的冰箱使用者(这也许是最真实的,虽然冰箱说明书不是名著……)
至于为什么这么说……我个人觉得就是对xx东西的一种崇拜,很大程度上是人云亦云。
算法导论是本不会动的书,不同人读效果不一样的。不要神化某一本书,参差多态乃幸福本源。不看算法导论你也可以会算法,你也可以会数据结构,你也可以进大厂。没有算法导论的时候也依然有研究算法的科学家。你能通过他学会知识很好,但你觉得它晦涩,搞不懂,没有c的代码让你学的不舒服,那就不看他。
人生中见书,书中见人生。读书有时候不一定是为了学东西,可能更多的是一种享受。就像你没学看过csapp之前,通过各种课程,学了零零碎碎的知识。忽然有一天你看了csapp,你觉得好过瘾啊,好爽啊。你觉得你学习的第一天就看csapp能有这种效果吗?
好书不会变少只会变多,更何况帮到你的也未必需要是好书。也许一本书只是很普通的书,不严谨,还都是大白话,但未必就帮不到你。
算法导论写的好不好,我觉得我水平不够,评价不了。
但这不妨碍我提醒这位题主,学东西莫要搞崇拜。很多程序员学习的时候都不是通过算法导论这本书学的,可他们依然很杰出。
最起码,轮子哥没学算法导论的时候,已经能写出很多我们现在都写不出的软件了。倒是很多人寥寥草草的翻过算法导论,题刷不出,软件写不了,反而以为自己会了很多东西。
发表于 2021-7-3 22:56 | 显示全部楼层
没有超越90%的程序员。
只能说在算法而且是传统算法(有精确解的非机器学习算法)这个赛道上超越了90%的程序员。
要学的东西很多,不要在学算法导论的时候进行自我欺骗。
发表于 2021-7-3 23:00 | 显示全部楼层
这个问题我太懂了!
我在BAT大厂 工作这么多年,发现一个问题,身边的同事都用《算法导论》来垫显示器,几乎就没看过......
我建议初学者不要看这本书了,算法导论毋庸置疑的算法经典书籍,里面囊括了计算机算法的精髓。
同时正式因为经典书籍都是大而全,所以会让想准备算法面试的面试的同学会抓不住重点。
而且里面的代码都是伪代码而且描述的非常晦涩难懂,这会对初学者造成的很大的疑惑。
例如这里是 《算法导论》对 广度优先搜索的介绍,这里介绍的广度优先搜索简单来说就是给定一个点,然后向点的四面八方扩展,直到找到目标点,然后画出最短路径。
相信如果基础不好的同学,看到书上这个描述会直接怀疑人生,但是我还是建议如果时间充足的话算法导论还是值得好好看一看。 如果仅仅是为了面试的话,可以先不用看这本书。
想超越了 90%的程序员其实很简单,只要按部就班把算法基础题目打牢,然后巩固自己的代码能力就可以了。
例如很多同学刷了很多题,但代码风格一团糟
    看了这么多代码,谈一谈代码风格!
在力扣上写了很多代码,却不知道本地如何编译
    力扣上的代码想在本地编译运行?
分不清什么是核心代码模式,什么是ACM模式
    什么是核心代码模式,什么又是ACM模式?
关于代码性能,一下几个问题都是直击灵魂的拷问,你看看你掌握了没
    关于时间复杂度,你不知道的都在这里! o(n)的算法居然超时了,此时的n究竟是多大? 通过一道面试题目,讲一讲递归算法的时间复杂度! 关于空间复杂度,可能有几个疑问? 递归算法的时间与空间复杂度分析! 刷了这么多题,你了解自己代码的内存消耗么?
如果要系统学习算法,究竟有哪些知识需要掌握,我简单花了一个图:
这样大家对算法有一个大概整体的了解,主要有以下几个方面
    算法性能分析 数组 链表 哈希表 字符串 双指针法 栈与队列 二叉树 回溯算法 贪心算法 动态规划 图论 复杂数据结构
如果刚看时对数据结构算法,一点都不了解,建议先看书,补充基础,关于书籍推荐如下:
入门:《大话数据结构》《图解算法》



《大话数据结构》总体的感觉是难度低于严老师的书。当然从本书的定位来说是完全可以理解的,本书是一本“入门”、“便于自学”的数据结构书,看起来非常轻松的数据结构入门书一点都不为过。
作者也在前言里说过了,本书的定位就是“入门”。对于自学数据结构的同学们来说,如果觉得严蔚敏老师的数据结构过于晦涩难懂,不如先读读这本书。


《图解算法》这本小书的最大优点就在推理过程交代清楚。一步一步、为什么这么想、这么走,都给你描画得一清二楚。换言之,它是按照事物发展的逻辑顺序进行内容构建的,看得就很过瘾,像一本推理小说。
所以这是一本看起来很过瘾的小书。细嚼慢咽,给你剥出来最精华的内核。
我之所以会盛赞这本书,认为作者很多地方讲透了,就是因为很多章节我一看完,或者看了一半,就忍不住想开力扣开始刷相关标签的题目。动规、二分尤甚。这就是他把我讲明白了的最好说明。
进阶:《数据结构与算法分析》《算法第四版》

里面使用的代码,不是所谓的伪代码,而是正经可以运行的C代码,所以新人如果能照着做一遍下来,收获应该不小.
而且不在简单的地方无谓的浪费笔墨,恰到好处的把初学者带入算法和数据结构的世界。
它基本上涉及了数据结构基础的“方方面面”。很难想象这书的厚度,居然能讲这么多内容(你看看算法导论有多厚就知道我在说什么了)。
最重要的是,你真的就感觉作者在你眼前给你说教一般,个人觉得,这本书真的算是一本有灵魂的书吧。甚至同一个问题在书中的不同位置出现,不断的被优化。
本书是使用C语言,如果你想使用其他语言,还有Java版本
或者大家可以看算法第四版。
这本书适合自学,对有一定编程水平的初学者简直不要太友好,方法抽象做的很好,不少方法附带的图示十分良心,连练习题都有友情提示不至于看到就懵。
不过也不是没有缺点,编排有点混乱、体系性还不是很够(相对《数据结构与算法分析》而言,链表、栈、堆的坑都比这本书讲的更深),算法里面重要的动态规划没有讲解,有讲贪心算法但是对贪心的概念一笔带过,不能不说是遗憾。
这本书虽然较为通俗易懂,也强烈推荐其中红黑树、单词查找树、字符串算法的部分,KMP有限自动状态机最好也要留意,但是有相当一些重要的算法思想并未多加涉及(如回溯、滑动窗口、动态规划、贪心)。
有了基础之后,就可以算法题了。
以上书籍的pdf我都整理好了,同时还有伴随我多年的计算机必读经典书籍pdf,帮助大家在编程的路上走的更快,走的更稳。
计算机必读经典书籍(含下载方式)
所以推荐刷题平台LeetCode(力扣):LeetCode
我这里整理出一份算法PDF,pdf中不仅有刷题大纲、刷题顺序,还有详细图解,每一本pdf发布之后都广受好评先,PDF中攻击30w字详细图解了 100多道力扣上的经典题目,上图:
无论现在要不要学习算法,先去下载看看吧,想进大厂一定需要这个!
BAT大佬的算法学习手册开放下载
LeetCode上的题目是有打标签的,面试高频题目主要集中在如下几个tag上。
基础的数据结构:数组、字符串、树、堆、栈、队列、哈希表
基础的算法: 枚举遍历, 二分查找,递归,回溯
明白基础的数据结构之后,我们可以发现 leetcode上已经做好了分类, 首先我们要按照类别来刷,推荐刷题顺序: 数组 ->字符串 ->链表->二分查找->排序->哈希表-> 栈->队列 ->树 、递归、回溯 -> 堆
第一次刷leetcode不要去碰什么动态规划,什么深度优先搜索之类的!
每一个类别里面有 简单、中等和困难的题目,例如这样,第一次刷leetcode,建议只做每个类别里面的简体题目,而且简单题目里面先做 通过率高的,如下图,在简单题目里 按照通过率又高到低的顺序做题
这样会避免刚开始做比较难的题目而丧失信心。
开始leetcode闯关:
第一轮刷题

题目类别推荐按照这个顺序来说: 数组 ->字符串 ->链表->二分查找->排序->哈希表-> 栈->队列 ->树 、递归、回溯 -> 堆 ,每一个类别只做简单的题目!而且是从通过率又高向低来刷。
这样刷过一遍之后 我们基础的数据结构和算法就已经差不多了、
第二轮刷题

开始做第一轮类别里面中等难度的题目
同时开始刷更高难度类别的题目,推荐按照这个顺序去做:拓扑排序->分治算法-> 二叉搜索树->贪心算法->动态规划-> 深度优先搜索 -> 广度优先搜索-->图->数学
这里依然还是只做简单难度的题目 按照通过率又高向低
第三轮刷题

开始尝试做第一轮里面的 困难难度的题目 (不强求,仅仅是尝试,面试中也不会太难)
同时开始做第二轮里面 中等难度的题目 (不用全都做,选一下自己一看就有想法的题目)
然后开始做做leetcode分类里面 第一轮和第二轮都没有涉及到的类别的题目,相对于其他类型,面试中最常考察的是: 字典树-> 并查集 -> 树状数组->线段树 , 这里只做简单难度的就可以了!
以上基本刷个 400题左右,就可以应付大厂的算法面试了。
但我能设身处地的感受到:即使有这样一个整体规划,对于一位初学者甚至算法老手寻找合适自己的题目也是很困难,时间成本很高,而且题目还不一定就是经典题目
对于刷题,我们都是想用最短的时间把经典题目都做一篇,这样效率才是最高的!
我们平时在力扣(leetcode)刷题,浪费的时间主要在哪呢?
如下三点:
    找题,昨晚一道题,就要找下一道题,还不知道怎么做什么题合适 找到了不应该现阶段做的题,好不容易找到了题,但是感觉有太难了,没有循序渐进 没有全套的优质题解可以参考,有的题目找到几篇优质题解,一看就懂了,有的题目找题解找半天,还都读不懂。
如果你刷题,对这三点一定深有体会。
其实我之前在知乎上也回答过这个问题,回答内容大概是按照如下类型来刷数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,再从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。
但我能设身处地的感受到:即使有这样一个整体规划,对于一位初学者甚至算法老手寻找合适自己的题目也是很困难,时间成本很高,而且题目还不一定就是经典题目。
对于刷题,我们都是想用最短的时间按照循序渐进的难度顺序把经典题目都做一遍,这样效率才是最高的!
最后关于整个算法的刷题套路我都整理出来了,包含了算法知识的方方面面,数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划。我都整理出一份PDF,pdf中不仅有刷题大纲、刷题顺序,还有详细图解,每一本pdf发布之后都广受好评先,PDF中攻击20w字详细图解了 100多道力扣上的经典题目,上图:
想要进大厂的话,一定需要这个,先去下载吧,你会发现详见很晚!
BAT大佬的算法学习手册开发下载
leetcode刷题攻略:一个超级详细的刷题顺序,每道题目都是我精心筛选,都是经典题目高频面试题,大家只要按照这个顺序刷就可以了,你没看错,就是题目顺序都排好了,文章顺序就是刷题顺序!挨个刷就可以,不用自己再去题海里选题了!
开始上料:
数组

    数组过于简单,但你该了解这些! 数组:每次遇到二分法,都是一看就会,一写就废 数组:就移除个元素很难么? 数组:有序数组的平方,还有序么? 数组:滑动窗口拯救了你 数组:这个循环可以转懵很多人! 数组:总结篇
链表

    关于链表,你该了解这些! 链表:听说用虚拟头节点会方便很多? 链表:一道题目考察了常见的五个操作! 链表:听说过两天反转链表又写不出来了? 链表:删除链表倒数第N个节点,怎么删? 链表:链表相交 链表:环找到了,那入口呢? 链表:总结篇!
哈希表

    关于哈希表,你该了解这些! 哈希表:可以拿数组当哈希表来用,但哈希值不要太大 哈希表:查找常用字符 哈希表:哈希值太大了,还是得用set 哈希表:用set来判断快乐数 哈希表:map等候多时了 哈希表:四数相加 哈希表:赎金信 哈希表:解决了两数之和,那么能解决三数之和么? 双指针法:一样的道理,能解决四数之和 哈希表:总结篇!
字符串

    字符串:这道题目,使用库函数一行代码搞定 字符串:简单的反转还不够! 字符串:替换空格 字符串:花式反转还不够! 字符串:反转个字符串还有这个用处? 视频来了!!带你学透KMP算法(理论篇&代码篇) 字符串:都来看看KMP的看家本领! 字符串:KMP算法还能干这个! 字符串:总结篇!
双指针法

    数组:就移除个元素很难么? 字符串:这道题目,使用库函数一行代码搞定 字符串:替换空格 字符串:花式反转还不够! 链表:听说过两天反转链表又写不出来了? 链表:环找到了,那入口呢? 哈希表:解决了两数之和,那么能解决三数之和么? 双指针法:一样的道理,能解决四数之和 双指针法:总结篇!
栈与队列

    栈与队列:来看看栈和队列不为人知的一面 栈与队列:我用栈来实现队列怎么样? 栈与队列:用队列实现栈还有点别扭 栈与队列:系统中处处都是栈的应用 栈与队列:匹配问题都是栈的强项 栈与队列:有没有想过计算机是如何处理表达式的? 栈与队列:滑动窗口里求最大值引出一个重要数据结构 栈与队列:求前 K 个高频元素和队列有啥关系? 栈与队列:总结篇!
二叉树

题目分类大纲如下:
    关于二叉树,你该了解这些! 二叉树:一入递归深似海,从此offer是路人 二叉树:听说递归能做的,栈也能做! 二叉树:前中后序迭代方式的写法就不能统一一下么? 二叉树:层序遍历登场! 二叉树:你真的会翻转二叉树么? 本周小结!(二叉树) 二叉树:我对称么? 二叉树:看看这些树的最大深度 二叉树:看看这些树的最小深度 二叉树:我有多少个节点? 二叉树:我平衡么? 二叉树:找我的所有路径? 还在玩耍的你,该总结啦!(本周小结之二叉树) 二叉树:以为使用了递归,其实还隐藏着回溯 二叉树:做了这么多题目了,我的左叶子之和是多少? 二叉树:我的左下角的值是多少? 二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值? 二叉树:构造二叉树登场! 二叉树:构造一棵最大的二叉树 本周小结!(二叉树系列三) 二叉树:合并两个二叉树 二叉树:二叉搜索树登场! 二叉树:我是不是一棵二叉搜索树 二叉树:搜索树的最小绝对差 二叉树:我的众数是多少? 二叉树:公共祖先问题 本周小结!(二叉树系列四) 二叉树:搜索树的公共祖先问题 二叉树:搜索树中的插入操作 二叉树:搜索树中的删除操作 二叉树:修剪一棵搜索树 二叉树:构造一棵搜索树 二叉树:搜索树转成累加树 二叉树:总结篇!(需要掌握的二叉树技能都在这里了)
回溯算法

题目分类大纲如下:


    关于回溯算法,你该了解这些! 回溯算法:求组合问题! 回溯算法:组合问题再剪剪枝 回溯算法:求组合总和! 回溯算法:电话号码的字母组合 本周小结!(回溯算法系列一) 回溯算法:求组合总和(二) 回溯算法:求组合总和(三) 回溯算法:分割回文串 回溯算法:复原IP地址 回溯算法:求子集问题! 本周小结!(回溯算法系列二) 回溯算法:求子集问题(二) 回溯算法:递增子序列 回溯算法:排列问题! 回溯算法:排列问题(二) 本周小结!(回溯算法系列三) 本周小结!(回溯算法系列三)续集 视频来了!!带你学透回溯算法(理论篇) 视频来了!!回溯算法:组合问题 视频来了!!回溯算法:组合问题的剪枝操作 视频来了!!回溯算法:组合总和 回溯算法:重新安排行程 回溯算法:N皇后问题 回溯算法:解数独 一篇总结带你彻底搞透回溯算法!
贪心算法

题目分类大纲如下:


    关于贪心算法,你该了解这些! 贪心算法:分发饼干 贪心算法:摆动序列 贪心算法:最大子序和 本周小结!(贪心算法系列一) 贪心算法:买卖股票的最佳时机II 贪心算法:跳跃游戏 贪心算法:跳跃游戏II 贪心算法:K次取反后最大化的数组和 本周小结!(贪心算法系列二) 贪心算法:加油站 贪心算法:分发糖果 贪心算法:柠檬水找零 贪心算法:根据身高重建队列 本周小结!(贪心算法系列三) 贪心算法:根据身高重建队列(续集) 贪心算法:用最少数量的箭引爆气球 贪心算法:无重叠区间 贪心算法:划分字母区间 贪心算法:合并区间 本周小结!(贪心算法系列四) 贪心算法:单调递增的数字 贪心算法:买卖股票的最佳时机含手续费 贪心算法:我要监控二叉树! 贪心算法:总结篇!(每逢总结必经典)
动态规划

动态规划专题已经开始啦,来不及解释了,小伙伴们上车别掉队!


    关于动态规划,你该了解这些! 动态规划:斐波那契数 动态规划:爬楼梯 动态规划:使用最小花费爬楼梯 本周小结!(动态规划系列一) 动态规划:不同路径 动态规划:不同路径还不够,要有障碍! 动态规划:整数拆分,你要怎么拆? 动态规划:不同的二叉搜索树 本周小结!(动态规划系列二)
背包问题系列:


    动态规划:关于01背包问题,你该了解这些! 动态规划:关于01背包问题,你该了解这些!(滚动数组) 动态规划:分割等和子集可以用01背包! 动态规划:最后一块石头的重量 II 本周小结!(动态规划系列三) 动态规划:目标和! 动态规划:一和零! 动态规划:关于完全背包,你该了解这些! 动态规划:给你一些零钱,你要怎么凑? 本周小结!(动态规划系列四) 动态规划:Carl称它为排列总和! 动态规划:以前我没得选,现在我选择再爬一次! 动态规划: 给我个机会,我再兑换一次零钱 动态规划:一样的套路,再求一次完全平方数 本周小结!(动态规划系列五) 动态规划:单词拆分 动态规划:关于多重背包,你该了解这些! 听说背包问题很难? 这篇总结篇来拯救你了
打家劫舍系列:
    动态规划:开始打家劫舍! 动态规划:继续打家劫舍! 动态规划:还要打家劫舍!
股票系列:


    动态规划:买卖股票的最佳时机 动态规划:本周我们都讲了这些(系列六) 动态规划:买卖股票的最佳时机II 动态规划:买卖股票的最佳时机III 动态规划:买卖股票的最佳时机IV 动态规划:最佳买卖股票时机含冷冻期 动态规划:本周我们都讲了这些(系列七) 动态规划:买卖股票的最佳时机含手续费 动态规划:股票系列总结篇
子序列系列:


    动态规划:最长递增子序列 动态规划:最长连续递增序列 动态规划:最长重复子数组 动态规划:最长公共子序列 动态规划:本周我们都讲了这些(系列八) 动态规划:不相交的线 动态规划:最大子序和 动态规划:判断子序列 动态规划:不同的子序列 动态规划:两个字符串的删除操作 动态规划:本周我们都讲了这些(系列十) 动态规划:编辑距离 为了绝杀编辑距离,我做了三步铺垫,你都知道么? 动态规划:回文子串 动态规划:最长回文子序列 动态规划总结篇
最后我已经把详细的算法学习路线都整理出来,并开源在Github上, 上图:
这个项目里面有200道经典算法题目刷题顺序、配有60w字的详细图解,常用算法模板总结,以及难点视频讲解,按照list一道一道刷就可以了!
去看看吧,这个Github算法学习项目会惊艳到你!
youngyangyang04/leetcode-master可以在B站上关注我,上面有很多算法的讲解视频。
代码随想录的个人空间_哔哩哔哩_Bilibili码字不易,希望对你有所帮助!
@代码随想录
点个赞就是对我最大的鼓励,笔芯~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-3 23:03 | 显示全部楼层
这样说的要不就是外行,对 CLR、CSAPP这种书总是抱着圣经般的吹捧
实际上这些书固然好,但也只是一份学习资料而已,不看算法导论就学不会算法了吗?
工作后你就会明白,做好以下任何几点都可以超过 95% 以上程序员:

1. 有 造轮子的能力 和 不造轮子的觉悟

2. 文档能力
文档是第一生产力”,这一点在程序员的世界是毫无异议的。看看Apache 下面那些最流行的开源软件的文档就知道,他们tutorial写的多么的易懂。
搞技术的容易忽视文档的力量,也因为写文档十分困难,更多程序员选择舒适区,但正因为如此,妨碍了不少程序员的进阶。

3. 注重单元测试
其实,Unit Test 的主要目的是,为了防止你不会因为一个改动而引入 Bug,做好单测,争取做到无bug提测

4. 面向搜索引擎编程的能力
这不是说要让大家写代码都去网上copy,而是遇到一个不会的知识点的时候,如何快速搜索获取到有用信息,并拿出适合项目的解决方案。

5. 熟悉工作的技术、组件
这很重要,对于自己公司内的组件,要做到搞清原理、适用的场景、出了问题怎么排查,不要天天去追热门技术。
能第一时间解决问题才是最重要的!

6. 项目把控能力
以终为始、确定里程碑。为了达成目标,所有的计划必须以终为始来制定。将大项目分解成几个小阶段,控制每个阶段的里程碑可以大大降低项目失败的风险。

7. 多总结,复盘
争取做到不二过,踩过的坑记录下来,形成经验文档,可以在组里分享,提高技术影响力

8. 不断学习优秀开源项目、业界技术
不要被公司局限,深入学习一些业界技术,思考自己项目是否能借鉴

9. 夯实计算机基础,修炼底层内功
虽然说面试造火箭,工作拧螺丝,但是对计算机底层的掌握程度往往是大牛和码农的分水岭,往往在排查系统性bug的时候会凸显。
顶尖的程序员,在内存、OS、网络、Linux等方面都是十分系统的,这样在遇到Bug的时候,才能进行全链路的分析!

10. 注重提升表达与沟通能力
程序员大多喜欢和机器打交道,相对来说表达能力弱一些,但是顶尖程序员的表达能力一定是很强的,需要良好的沟通才能和产品、其它程序员快速对齐方案。

11. 胶水能力
"胶水"能力其实就是一个人编程素养的综合体现。优秀的工程师应该是以最小成本快速实现需求,而不是拿到需求就想从头造轮子。

12. Code Review是学习的好机会
初级工程师应该多写代码、多看代码。
找高手做Code Review,也是提升编程水平的捷径。

13. 规范化的代码编写习惯
良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。

14. 输出倒逼输入
要长期坚持学习,并且总结输出自己的经验和学习笔记,教是最好的学习方式!

15. 坚持看一手资料、官方文档
官方文档很多getstarted写得非常全面清晰,不要去看CSDN那些二手资料。
系统性学习还是得看书,博客真不行,别再天天抱着那些抄来抄去的博客学习了,我就很喜欢看书学习。
比如我自己整理的电子书库,绝不是在网上那种打包下载的,而是自己需要学到某个方向知识的时候,需要看了,去网上挨个找的,最后汇总而成。
汇集了编程语言(Java、C++、C、Python等等)、操作系统、计算机网络、系统架构、设计模式.....等主流的编程学习书籍。
这部分我是会不断把它完善的,当成自己的小电子书库,不多,但贵在精。
我整理的这些书大家可以在这里获取,对于程序员和学习计算机的同学帮助非常大,且十分系统
免费分享给大家:书单:
计算机必看经典书单认同小可爱记得给我 @编程指北 点个赞哟~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-3 23:08 | 显示全部楼层
被 @白如冰 冰神的回答吸引了,来回答一下
问题是“为什么有人说弄懂了《算法导论》的90%,就超越了90%的程序员?”
问“为什么”之前,先回答“是不是”。
答案是“是”,而且不仅仅是超越了90%的程序员,还超越了90%以算法为主的研究生
理由如下
这门课在mit要开三到四节refer这本书的课,课时,内容和方法都不一样
分别是1,Introduction to Algorithms(绝大多数用此书的人都有且仅有看过这堂课)
视频(为了方便大家我只放b站链接)
麻省理工学院公开课:算法导论_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili2,Design and Analysis of Algorithms(少数人还看过这堂课)
【MIT】算法设计与分析中英文字幕_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili3,Advanced Algorithms(录制的少了两堂课,不知道以后会不会有更新的版本)
【MIT公开课】 6.854 高级算法 (完结)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili你会发现course sequences这里标明了这是这三堂课的第三部分
4or3,Advanced Data Structures
【MIT公开课】6.851 高级数据结构(完结·中英字幕· 机翻)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili这门课的参考如下
四门课我基本上都大致上了一边,也根据course materials上机将近100个小时(后面两堂课我至少有30%没弄懂)
我的评价是,如果你要做算法相关的研究,这本书(以及配套课程)相当好,给我的感觉像是folland那本实分析或者是munkres的拓扑还有Boyd的凸优化,虽然我只会用到这里面小部分的知识,但是我增长了世面,知道未来如果我有这方面的问题应该向哪个方向是思考。
但是如果你仅仅是学会如何使用算法的知识来编写程序,我不推荐你看这个书
如果你是国内(以c语言为基础的在校学生)
我推荐这本书
《算法:C语言实现(第1-4部分)基础知识、数据结构、排序及搜索(原书第3版)》([美]塞奇威克)【摘要 书评 试读】- 京东图书32151|正版包邮 算法:c语言实现(第1~4部分):基础知识、数据结构、排序及搜索(英文影印版·第3版)[图书]这本书是Robert Sedgewick写的(那本以java为基础的红色算法书就是他写的),分上下两册,下册是图算法,建议有图论基础在进行学习
此外,我推荐两本离散的小册子,一本书北大在培养方案中refer的书
A Course in Discrete Structure————Rafael Pass and Wei -Lung Dustin Tseng
这本书告诉你离散数学中最基础的概念,集合论,证明,数论,组合,概率,逻辑,图论和有限自动机(理论上来说这个应该归类在计算理论中)
另一本是世图引进的图论小册子
Introduction to Graph ——————Robin.J.Wilson
《图论导论(第5版)》([英]R.J.威尔逊(Robin.J.Wilson))【摘要 书评 试读】- 京东图书这两本书都只有150页左右,非常薄,慢慢读一周可以读完
我建议初学者可以阅读这些书,较快的建立自己的框架,然后补充阅读一些东西,没必要一上来阅读五百多页的离散数学,容易丢了西瓜,捡了芝麻
如果你感觉自己的C语言掌握不好
我推荐这本书作为你的辅助阅读
《C语言程序设计:现代方法(第2版)(图灵出品)》([美]金)【摘要 书评 试读】- 京东图书

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-3 23:16 | 显示全部楼层
有这时间不如好好补补情商课……
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-21 03:34 , Processed in 0.070633 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表