楼主: 胖头龙
跳转到指定楼层
上一主题 下一主题
收起左侧

[其他] 胖头龙的咸鱼刷题笔记-算法篇

   
🔗
khart 2020-10-24 10:13:52 | 只看该作者
全局:
Pythonic 发表于 2020-10-20 00:55
题目优先级分类让我醍醐灌顶,谢谢楼主的分享!

必背,大约20~30道,都是各类型题目的典型模板题,基本 ...

要是能把题号给出来就好了!尤其是必背那30道。
回复

使用道具 举报

🔗
 楼主| 胖头龙 2020-10-24 11:27:17 | 只看该作者
全局:
xiaohaoZZZ 发表于 2020-10-18 10:43
赞,LZ 写得非常全,有很多观点、方法我在别的帖子里也这么建议过。

但LZ既然说要更新,我就有一个小小 ...

按照计划,楼主会按分类给出题号的~只是业余时间码字不容易,每写一章从挑选准备题目到写字需要很多个小时~只能尽快更新了~

评分

参与人数 1大米 +2 收起 理由
Marcella + 2 给你点个赞!

查看全部评分

回复

使用道具 举报

全局:
楼主这个攻略真是详细👍🏻。一周大概要多久比较合适,现在工作还挺饱和的😭
回复

使用道具 举报

🔗
qqygg 2020-10-26 00:51:13 | 只看该作者
全局:
楼主真的厉害!感谢!
回复

使用道具 举报

🔗
 楼主| 胖头龙 2020-10-26 06:38:14 | 只看该作者
全局:

第二章 刷题笔记体系




胖头龙推荐使用完整的笔记系统来记录我们已经刷过的题目内容。

有些同学会觉得题目直接刷不就行了?还花时间整这些没用的?

对于一些几个小时的任务,直接莽一波确实没太大问题;但是刷题是一个几百上千小时的任务,多花一些时间在笔记和整理上,长远看来会有事半功倍的效果。



做笔记的好处


(1)方便查找、记录:
很多时候我们做完、想明白一道题以后其实很快就会遗忘(领悟一时爽,事后忘光光)。
其实在思考过程中,我们会有一些很好的结论和过程,值得及时记下来。
虽然可以通过查看leetcode的submission来查看过往提交的代码,但是这样效率比较低,而且debug次数多的话,会把自己弄混。
所以记录一个属于自己的“golden” 答案是有必要的。

(2)方便复习过题
整理过的笔记对于复习过题非常有价值,只需要点开相应的标签(分类或优先级),可以在几个小时内回顾几十道题的思路、要点和解法,对于加深记忆有奇效。

(3)方便下次找工作
在“前言”部分也提到过,作为一个程序员,从毕业到工作十年左右,你可能需要找三四次工作,而且基本都逃不过算法面试。
因此,这次准备的笔记,以后都可以使用。

(4)培养良好工作习惯
作者在几家公司工作过几年,身边很多正例、反例都说明一个有条理的员工是非常受欢迎的,无论是对老板还是同事。
不思考、不总结、上来就莽代码,想到哪做到哪的工作风格会让别人十分头痛,对你自己也没有好处。
Organized是一个工程师的基本素养,而且这和move fast并不冲突。



在本文的刷题笔记里,作者把每道题写成一页笔记,并且打上不同的标签。这样我们可以根据不同标签来快速查找分类题目。

我自己用的Evernote(不是广告,纯粹因为当年找了一个名气还可以而且免费的,你可以用你喜欢的任何App),比较喜欢里面的多标签功能。
一开始我十分痛苦它为什么不使用hierarchy 的 文件夹形式,后来发现扁平的 notes 外加 hierarchy 的 tag 反而更高效,因为这样同一篇note 可以出现在不同的 Tag Tree 里,非常方便。



标签分类

按题目类型分:
Binary Search, BFS, DFS...等算法分类,同时在按数据类型分,就像leetcode的标签一样,每道题因为有多重属性所以可以打上多个标签。

按重要性分:
在“前言”里面也说了,作者把题目分为四个优先级,所以刷题力度也不同:
<1> 必背,大约20~30道,都是各类型题目的典型模板题,基本需要刷十几遍,做到迷迷糊糊半昏迷状态也能熟练默写的肌肉记忆状态。
<2> 核心,大约100~150道,主要是各种高频题和经典题,基本在5~8遍以上,需要做到最优解,medium难度10分钟以内,hard难度15分钟以内,无错一遍过,同时要能解释清楚思路。另外有多重解法的也要掌握,知道不同解法间的优缺点和trade off原因。
<3> 重点,大约200~300道,核心题之外的高频题,基本在5遍左右。这样遇到原题或者类似题的时候,基本思路、逻辑不会错。能不能临场完全bug free要看基本功和运气。
<4> 普通,上述题之外所有你刷过的题。基本上做过一两遍,有个思路,临场遇见了不会慌。


当然你也可以创建更多的分类,比如难度、公司什么的,看你自己的需要。
进行过题复习的时候,直接点开某一类标签,然后几分钟过一题,非常有效率。


一些标签示例(之前截的图,有些中英文混用了,请忽略这个细节):







笔记内容

每一题记录为一页笔记。


首先会抄下题号、难度、链接和截图题面。这样的好处是复习的时候不用再点开leetcode,省时间。

其次作者一般会添加这几个部分内容:

讨论澄清:
这个其实也是你需要和面试官clarify的内容。
因为实际面试不会像leetcode把一道题明明白白的摆在你面前,而是先给你一个模糊的描述,需要你问问题、讨论逐步细化明确需求。
所以在平时做题的时候,多想一想这些问题,对面试非常有帮助。

一个小tip,leetcode题目里面的notes,constraints 很多时候就是我们面试中需要先澄清的问题。
仔细想一想为什么要加这些条件,如果不加的话题目解法会出现什么样的变化,带着这样的思路去看题,也就知道面试的时候需要clarify什么了。

解法思路:
如果有多重解法,分开写。
对于每一种解法,描述一下核心思路和主要解法步骤。
其实这也是面试中,你向面试官简要描述你的解法的过程,对着屏幕自言自语练一练。

注意要点:
代码实现中需要注意的细节,这主要来自于你写这道题是遇到的具体问题,和 debug中领悟的要点,往往也是易错点或者比较tricky的地方。

复杂度:
常见的复杂度分析,每次做题想一想,分析一遍,自然就熟悉了。
同时也是不同算法之间trade off重要准则。

代码:
贴上你自己准备的"golden"答案,一方面方便复习,同时也促进了代码风格的形成。


下面是一个笔记的例子,因为优先级相对较高,所以写的比较细。
其实不用每题都写这么复杂,抓准每题的重点即可。
也不需要一次性写这么多,很多内容实在反复刷反复想的过程中逐步添加的。
这个例子里面有三个标签:Pointers-array,Heap,优先级2_核心。








刷题记录表

除了分类笔记,我们还需要一张总体的刷题表来记录自己当前的状态。
它可以帮助我们一目了然的看出哪些题我们做的还不够,下一步需要加强哪些方向。

这张表包含:
要求:必背,核心,重点,普通,分别用不同颜色区分,方便观察。
题目链接:指向leetcode的链接,并用颜色区分的难度。
分类:分类标签。

当前刷题状态:
包括最近刷题、过题的一些信息。特别是最近一次的写题时长和重交次数,这个决定刷题状态的颜色条:
深红:连答案都没看懂。
浅红:最终提交通过,但是时间太长或者重交次数过多(简单/中等超过10min,hard超过15min, 重交达到2次且有逻辑漏洞)。
黄色:第一次能在规定时间内完成,顶多有一两个typo造成的错误。
绿色:连续两次按时无错通过。

备注:一些其他信息,灵活使用,比如某题是其他题的follow up之类的。

截图一个之前的栗子:
一开始可能很空旷而且都是红色,后来渐渐变绿就越来越稳了。






以上就是胖头龙记笔记时的一些要点。

之前有同学建议胖头龙可以把刷题记录表和计划表(后面章节会提到)做成一个小App,方便大家使用,但确实业余时间有限,最近看来是没戏了。

其实具体形式不是最关键的,重要的是学习、工作的时候,形成一套自己的信息总结体系,做一个有条理的工程师。











































评分

参与人数 22大米 +52 收起 理由
Marcella + 2 给你点个赞!
yii + 2 给你点个赞!
agign + 1 很有用的信息!
juliahe130 + 1 很有用的信息!
wj340120 + 2 给你点个赞!

查看全部评分

回复

使用道具 举报

全局:
感谢楼主的更新~每次都有新的知识,之前还担心会烂尾。。。
回复

使用道具 举报

🔗
yhcbme 2020-10-26 07:07:42 来自APP | 只看该作者
全局:
感谢楼主的时间...可是我想说这个算法笔记deep dive对转码小白太不友好了,这起码是刷了200-300并且刷了3-4次才有的总结...比较适合life-long刷题跳槽的senior
回复

使用道具 举报

🔗
 楼主| 胖头龙 2020-10-26 09:00:20 | 只看该作者
全局:
yhcbme 发表于 2020-10-26 07:07
感谢楼主的时间...可是我想说这个算法笔记deep dive对转码小白太不友好了,这起码是刷了200-300并且刷了3-4 ...

恩,你说的对,这个例子里的笔记确实是一个比较完备的状态,确实需要反复即便才能写成这样。只是我们并不需要一次就能写出这么详细的笔记,也不需要每一题都写的这么细,还是要分重点。

特别是刚开始的时候,不需要一次到位,能理解多少就理解多少。

楼主刚刷题的时候笔记基本是这样的:
************************************
抄下题目。。。
看看leetcode solution,搜一下中文blog,抄下一个最顺眼的答案。。。
心得体会:
这行是啥意思?这行又是啥?
这段大约可能也许是这个功能吧?
没看懂,留个戳,下次再来看。。。
************************************

然后一遍一遍之后会逐渐提升,这个过程后面的章节也会细说。

如果你一开始,或者说三刷之内就能达到例子里的水准,那你已经非常优秀,超过大部分同学了。

楼主周围转专业的同学,大部分也都是国内/北美不错的学校,基本上也都默默准备了六个月到一年,还是前几年门槛比较低的情况,少数大牛三四个月成功的, 但不代表大多数。

特别是最近疫情,科班毕业的都不好找,因此门槛会更高一些。所以算法这部分还是需要花一些时间和耐心去提高的。

评分

参与人数 2大米 +12 收起 理由
Phenomenon. + 10 赞一个!
yhcbme + 2 谢谢分享!

查看全部评分

回复

使用道具 举报

🔗
8910Yay 2020-10-26 09:17:23 | 只看该作者
全局:
楼主提到的刷题分类题号,什么时候可以看到?
回复

使用道具 举报

🔗
星火之心 2020-10-26 10:29:18 | 只看该作者
全局:
谢谢楼主提供刷题的细节跟心态调节
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

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