想分享一下我独特的高效刷题法(一个月200题,拿过BAT)
战绩
介绍一下自己
机械专业 非科班 渣硕 擅长搬砖和划水
我和各位一样 我也是21届的 我也在近经历秋招
然后拿到过BATH的offer
(字节跳动 阿里巴巴 腾讯 华为
)
还有很多正在走流程中
详情见下方
拿到阿里和字节跳动的offer以后应该就会结束秋招
下面我会先讲一下我刷题相关的准备流程
然后具体开讲我总结的刷题法
到底是怎么样的 是不是真的有那么神奇
多的我就不细讲了 详情可以看上篇文章
下面直接开始上干货
陈同学刷题法
关于我的一个前期过程
我对算法的一个学习过程 大致如下
在学完数据结构以后
然后就陆陆续续的开始上牛客开始刷剑指offer
当时效率很低 一天也就两三道题
后面发现了一门网课 是leetcode刷题班
是一个阿里的工程师来讲一些
高频的考察到的leetcode题
感觉很不错
然后就跟着这个课
但是没有看视频 只是看它配套的ppt
然后只挑了一些我觉的合适的题目来练习
感觉他的ppt做的很不错 很多流程做的很清晰
很多看文字题解没看懂的 看他的ppt就看懂了
并且我把剑指offer和这个网课对应的题目
都放到自己做的一个思维导图上面了
总共下来也就不到一百道题
同时在去年的2月的时候
按照不同的分类将这些题
总结在了自己的微信公众号上
感兴趣的朋友可以
到我的微信公众号上
"陈同学在搬砖"
翻一翻往期的"Leetcode面试高频题系列"
或者你如果想要这们网课的资料的话
直接在公众号后台回复 "福利"
即可
上述这些工作都是在2020年3月分之前做的
也就是在这么长一段时间里面
我只搞定了不到一百来道题
由此可见一开始并没有投入太高的重视
投入的精力真的很少
这也导致了在2020年3月之前算法真的很差
基本上是属于只要面试出了手撕代码
通过的几率就很低
关于时间的一个整体规划
但是到现在回过头来看 ,
我倒是觉得我的策略依然是正确
的
因为我觉得前期太早刷过多的算法题的
投入产出比太低
出于以下几点
- 第一是
遗忘问题
, 按照很多人传统的刷法 一天几道的做法
或者最多辅助以按分类的方式 可能几天之后
就会忘记第一天刷的题的解法和思路
- 第二就是
命中问题
他不像计算机基础那一块
我觉得像操作系统 网络 数据库等等这些知识他虽然看起来多
但其实 面试考察是有侧重点的
你看了面经就相当于可以知道考试重点范围在哪
你看的时候心里是有底的 你知道你看的东西是肯定高频率会考的
但是刷题就不一样了 出哪道题完全按照面试官心情
你找不到他的范围在哪 leetcode那么多题
真的要一道一道过一遍 ?
对于这个问题我一开始也很头疼
但是后面很幸运 我按照我摸索的方法没有进行题海战术
,
自己给自己划定了一个刷题范围
也就200多道题 竟然神奇的押中了面试中80%
的手撕算法
这200多道题包含了哪些呢? 后文马上会揭秘
第三 就是 刷题的话 他不像你学习计算机基础和写项目
做实习那样 相比于刷题 这些你去做了 学会了写完了
你立马就能够写在简历上
能够在面试的时候让面试官看到
也就是你的投入对应的产出是可预期的
但是刷题的话 是不可预期
的 有可能你在前期刷了很多
但是后面忘了
或者在面试的时候完全没有考到
倒不是完全没有产出 至少你锻炼了自己的算法思维 ,
但是相比于前者 同样的投入对应的产出收益是大大折扣
的第四 :非科班问题 对于零基础 非科班 机械专业的我来说
而且还是选择了对新手极其不友好的让人头疼的C++ 开发岗位方向
各种底层的内存 linux内核之类的东西 把我折腾的***
太多需要补的东西 所以一开始在疯狂的看大部头的经典书籍 各种资料等等
但是这些你看懂了就会有立杆见影
的效果 只要会了你就可以写到简历上
在面试中吹比
对比投入产出比更低的刷算法题题 自然是把它们作为优先级更高
的选项
这也是我为什么
没有在前期投入太多时间和精力放在算法题上 ,
而是主要放在
找实习 写项目 学基础,写博客
等等其他这几块
这也导致了我在2020年2月份以前
算法题就是自己的软肋
面试中碰见手撕算法就打怵 手心就冒汗
总之 算法题早早的开始就
投入很多精力猛刷这种方式有他的优点
能够培养你的算法思维 让你熟悉解题思路
但是你必须要承受的几点缺陷就是
特别是对于像我一样非科班零基础的同学来说
他给你会耗费你相当大的精力
,
而且不能给你带来明显的产出
产出不可预期
不能保证刷了面试官就会考 考了自己就一定会
关于传统刷题法的缺陷
我有小小的调研了一下
关于刷题好像大家的做法都是大同小异的
好像没有啥太有"创意"的刷题方式
以及好像没有太多方法论在里面
比如一般就是按部就班
随机的
或者按照tag分类
的方式来
一道一道
的刷题
你可能会经历以下状态
- 每天坚持的再刷 想找到所谓的题感 但是 拿到一道新题 还是
面露难色 毫无思路
- 有思路 但是只能想到
暴力解法
或者非最优解法 还是看看题解或者讨论区的大神们是怎么做的吧 - 终于理解了解法以后 开始写代码实现 又很大概率会被一些
逻辑细节卡住
导致效率超低
停滞不前 - 当你刷完一定量 再回头看的时候 会发现前面的刷过的题 好像都
忘得差不多
了 以前会的 现在又不会了 打击斗志丧失信心
- 更要命的是 你在不停地刷 但是面试官出的题总是会
完美避开你刷过的题
,专门找那些你没刷过的 考你
所以到底有没有一种
能够让你
记得牢
刷的多
命中高
可突击
高效率
的刷题方式呢?
经过我后面的摸索与总结
我觉的是存在的
至少对于我来说他是可行的
这也是为什么我在今年3月份看到手撕代码就心慌
在短短的两个月内通过这种方法的实践
就能在在面试的手撕代码环节
和面试官谈笑风生 亦可赛艇
废话说了那么多 下面正式揭秘!!!
关于具体的执行步骤
第一步 划定范围 锁定高频
要不要去划定范围?
正式开始我们的刷题之旅
到了这一步很多人就立马撸起袖子开始干了 盲目的从 1号题 在键盘上一通操作 开始一道一道的coding 也不知道终点在哪 每天两三道吧 坚持下去 反正干就完事了
但是对我来说我可能不太喜欢这种方式
这一个可能和个人学习习惯有关
我是一个比较急性子的人
不太喜欢这样细水长流的每天一道
我喜欢那种能够全局把控 看的到终点
的学习体验
怎么说呢?就是当你按部就班每天几道这样的刷
你也不知道自己的最终多少道才能结束
而且当你刷到一定量以后
你不知道前面的是记住了多少还是今天刷明天忘
刷题的效果是不在你的把控范围内的
总之 刷起来没有限定范围的话
很容易失去方向感
至少对我而言 效果不是很好
如果给自己划好范围
比如我就一门心思的搞定我划定范围的这些刷题量
那这样的会就会更有针对性
就好比一个没有终点的马拉松
和一个终点明确的短跑
对你来说 哪个更简单?哪个更能看的见效果?
划定哪些范围合适?
我们决定要划定刷题范围 也就是限定刷题量
说到刷题量
很多人的第一个疑问就就是刷多少比较好
大部分人的第一感觉是多多益善
刷更多的题 见多识广 锻炼题感
但是就像前面说的刷题的那些缺陷
更多的题意味着更多的精力投入
而刷题又是投入产出比比较低的一项工作
将这些精力拿去刷实习 刷项目 刷基础
这些见效快 立竿见影的活不是更好?
所以 如果你现在离秋招或者实习还很早的话
那么多刷一点是建议的
但是如果你像我一样
到后期 精力有限 时间有限的话
那么去刷固定范围内有限的题
把他们完全掌握就好了
那又有一个疑问?
到底这个有限范围内的题
我应该怎么去划定这个范围
呢?
前方高能来了 !!!!
经过各种渠道的收集和调研 (包括刷了不少于100个面经帖子从中进行分析, 还有各种神秘渠道) 于是我在3月份的时候总结了 一个200多题刷题范围 自己就按照这个200多题的范围来刷 对 就只有200多道题!!! 而且这200多题里面没有偏题怪题 没有hard 只有medium和easy 就是这200多道题 拯救了我在三月份汲汲可危的面试 竟然神奇的押中了我大大小小 几十场面试中的80%的算法题
如果各位需要这个我搜集好的刷题范围的话
可以在到我的公众号 "陈同学在搬砖"
后台回复"刷题范围"
我会将我这200多题的一个刷题
以截图的形式发给你
这里还有一个小的tips
就是你在收到我给你的这个刷题范围以后呢
可以利用leetcode里面的收藏功能
找到每一道题 点击一下第二行上的"小心心❤"
就可以加入则的收藏列表
然后就可以把这些题都集中到一起
了
实践证明 集中在一起刷的话 效果会更好哦!!!
因为这样你的思维是不会分散的
第二步 只看不写 记牢思路
传统的刷题四步走
标题我们说可以做到一个月200题
我绝对不是标题党
而是在我身上真真实实发生过的
我们其实可以
把一个月分成两个15天
就相当于把目标分解为15天搞定100题
首先咱们分析一下
可以先把刷一道题的过程拆解一下
本质上可以拆解为以下几个步骤
step1 :想出大概思路 step2 :把思路具体化到能用伪代码表达 step3 :把思路具体化到能用实际代码表达 step4: 调试debug
我感觉最耗时间以及最难的是第一步第二步
只要思路和过程理出来了
后面两步只是时间问题
对于前两步
像我一样脑袋比较笨的,
有些题可能一道
easy题不看题解都得懵半天
如果用传统的办法来
每一道题都按照这四步的流程走下来
那么对于一道新题
像我这样脑袋比较笨的人
卡壳是大概率事件
而且就算你能够流程的写下来AC
你也不能保证你的解法是最优解
而面试的时候 面试官一般会要你写最优解
可能你一开始写的不是最优解
也肯定会叫你优化到最优解
所以按照这四部走下来
一道题上耗费的时间会很久
我一开始按照这样的方式走下来
每天只能刷两三道新题
如果按照这个过程,200道题刷下来
战线会拉的很长
当你整个战线拉的长的时侯
效果就会大打折扣了
因为遗忘问题
就会愈发凸显
而且你的斗志会愈发丧失
而且这样的效率会很低
所以这里引入了另外一个大招!!!
前方高能!!!
将第一二步进行剥离
我的方式是把第一 二步和第三四步剥离开来
具体来讲 就是说
咱们一开始不是已经收集好了
那200多道题了吗
咱们下面要做的就是
只看不写 记住思路
具体来讲就是 针对这200多道题
你这一步的任务就是做到
能够熟练的记住他们的思路
就是你在拿到这200道题中的任意一道的时侯
能够条件反射般的在你脑子里映射出它的解法,
注意只是解法 不用要求你能够写出代码
好处1:这样的好处就是刷题四步的前两步
剥离
将难搞的都放在一起集中攻破
效率会大大提高好处2:就是有些面试中
比如电话面试面试官只要你能够说出思路就够了
这样的话当你在这一步能够熟练的话,
说出思路自然就不在话下了
怎么样获得思路?
然后每道题的思路是怎么得来的呢?
方式一:自己想 方式二:看题解
我不知道大家的想法是怎样的
很多人会觉得上来就直接看题解不好
会扼杀自己的算法思维
成了"背题怪"
这个问题可以从下面几个方面来考虑
1.你可以把这200多到题理解为
种子题
,
就像高中数学题, 例题做多了 ,
看懂了他们思想 ,熟练了他们的解法,
其实举一反三
很容易 ,
可以把这两百多道题理解为训练样本
,
用训练样本的最优题解
来训练自己的算法思维,
两百题之外的作为测试样本
试试看 .说一句比较拗口的话来表达就是
思维的发散不是凭空而来的 而是根植于你脑子里已经汲取的东西
说人话就是记的多了,思路自然就开阔了
2.题解上表达的一般都是最优解
学会了最优解是怎么样的,
恰恰是对培养自己算法思维最好的养料
,
相反如果你一上来就按照自己的思路来 ,
除非你天赋异禀 否则很难在短时间内找到最优解,
然后如果就这样一直按照自己的暴力解法
走下去 ,
自己的算法思维反而会走跑偏了
- 3.面试中的手撕代码环节虽然说是
开放性
的 也就是说你可以用任意解法
都行
但是据我几十场面试下来的观察 其实面试官它自己心里是有他的标准答案的
而他的这个标准答案其实很大概率上就是leetcode题解里面的最优解
如果你写的和他自己心里的标准答案不一样的话 他会叫你解释
解释完如果他觉得不合适的话 他还会叫你优化 优化不好的话就会大大减分
- 3.面试中的手撕代码环节虽然说是
所以呢 合适的路子应该是什么样的呢?
我觉得应该这样
先自己思考自己的方案 五分钟后 不管想出来了 还是没想出 都要看题解 看题解里面的最优解 . 然后要记住他的思路 然后看他的实现代码记住关键的几步代码 还有要记住他的一些诸如边界条件 等等这些特殊情况处理代码
这一步下来要达到什么样的效果呢
要能够在你的脑子里形成画面感
形成数据流动的动画
然后同时能够牢牢的记住题解里面的关键几步代码
可以按照tag的分类
来刷
在看题解思路的时候 可以做一些笔记
因为只是记录思路
所以不会笔记不会记得太大篇幅
记录关键思想和过程
或者自己不理解的地方
看第一遍可能会有点吃力
时间方面的一个安排
关于时间的话 按照我个人的一个实践
我觉得一个小时3~5道题
应该没问题
然后一天如果能够投入8个小时
的话
一天30道题
应该是没问题的
然后第二天继续看
另外的30道题
同时复习昨天看的30道题
复习的话因为有了印象和自己记得笔记当然会很快
就是按照这样的节奏持续
我觉得3~4天完成100道题是没有问题的
注意 这三到四天只看不写 只记思路
然后第四天第五天
把前面三天看的100题综合在一起复习
也就是一天100题 因为你有前面三天的学习的基础
而且如果你前面三天确实理解了思路
我觉得虽然100题看起来数量很多 其实难度并不高
这一步的两个小建议
这里面还有两个小的tips:
1.可以在手机端下载
力扣app
很多人可能还不知道力扣竟然也有app
下载力扣app的作用是什么呢?
在力扣app里面是可以登录查看自己收藏的题
的
而且也是可以调出看讨论区和题解部分
的
所以可以很方便的随时学习复习 不用一直坐在电脑前比较束缚
也可以很方便的利用日常零碎的时间
来看
而且网页端的内容还是比较繁杂臃肿不轻便
- 2.在前面三天初次的看题的时候 可能会有一些题
很难搞 很难理解
你就是记不住或者想不通他的解决思路 ,
可以把这些题单独单独扣出来
,放进浏览器收藏夹
里面的文件夹中
然后后面第四第五天复习
的时候看这个文件夹下面的题
类似这种想法 可以刷完一遍就筛选出哪些自己疑难杂症题 把那些自己掌握的题就剔除
这样不断筛选
最终留下的也就二三十道
难搞的题
第三步 各个击破 开始手撕
关于手撕时候的一些思考
通过前面的只看不记
阶段下来
如果你能够很好的去贯彻理解的话
以个人经验 完全可以达到
看到一道题 就能够反应出它的解题思路
而且还是最优解
同时脑袋里
会条件反射般的有数据流动的动画
出来
在这一步的话就需要你开始写代码了
但是不用慌 因为你已经把最难搞的部分搞定
了
只要你脑袋里还能记住那些解法和过程
你脑袋里还存在那个动画的话 我觉得问题不大
在这一步的难点就是一些逻辑上的小细节
比如边界条件 一些特殊情况等等可能会卡一下
所以就要求你
在前面的第二步能够去记住一些
关键环节代码 和边界条件
在这一步你依然可以结合按照 tag去刷的方式
这一步会耗一点时间 每天需要你投入一定时间
按照我当初的进度 我是5天内拿了下来
算是挺肝的 因为我不想把战线拉的太长
当然并不是每道题都是AC了
有一些虽然没跑通但是不想
一直阻塞在那里因为一些小细节卡的太久
所以就跳到下一道了
其实以我的经验来说
第一遍也不用十全十美
一定要AC
重要的是要能够撕出来
能够将第一二步的思路用代码落地
并且没有逻辑上没有太大的问题
因为下面几个方面
- 一是 你的进度很大程度上就是被这些难搞的题或者题目里面的
一些小细节
给拖住的
如果第一遍能先放他一马
下次在研究的话 完全可以很快就完成
大的逻辑方向掌握了其实问题不大 可能你第二遍刷的时候那些小细节自己就想通了
(我是这样做的 因人而异) - 二是 面试的时侯很多情况下
并不要求你一定得要去运行
很多时侯你写完了面试官看懂了觉得没问题也就过了
所以小的细节错误可以先放一边 大的逻辑方向别出问题就行
三是 类似第一步那样的做法 你可以用浏览器文件夹 一步一步剔除那些自己会的题 留下难搞的题
关于手撕时候的时间安排
第一遍100题的手撕我大概花了五天
第一遍手撕之后你的浏览器收藏文件夹
里会放着没有拿下来的题
好的 下面的话
那些会的题
也就是那些你一遍过的题你就可以不用管了
专门针对那些你浏览器文件夹里面的题
也就是那些难啃的骨头 发起猛攻
可以用3天时间或者更长 对他们反复刷
可以是一两遍 也可以是三四遍 四五遍
刷到你会为止 刷到你形成肌肉记忆为止
关于手撕时候的小建议
这其中当然也有一些小的tips
- 1.别遗漏了那些
没有放进收藏夹
里面的题
那些没有放进去的题可以进行用第一步的方法进行翻滚复习
- 2.手撕的时候可以按照
tag 分类
进行总结.总结关键思想 关键代码
- 3.参考刚才说的思路 可以
不断的筛选
每刷一遍 把那些自己觉得会的题剔除
当你刷了三四遍以后就会发现最后的残留的疑难杂症就只有二十来道题
其实这个过程也是有科学依据的
可以百度一下 艾宾浩斯记忆曲线
第四步 解决遗留 发起总攻
重复上面的过程
按照这样的一个过程
整个的时间花费应该是
5+7+3
也就是15天
理想状态下15天可以搞定100题
当然每个人的特点是不同的
你当然可以按照合适自己的一个时间去规划
100题搞定了 200题还会远吗?
继续按照上面的流程 干就完了
还需一个小建议就是
在刷第二个100题的时侯
可以用力扣app端
每天去巩固复习前面的100题
不会花太多时间
可以充分利用一些零碎的时间
对难题发起总攻
其实到最后这200道下来
你会发现真正会卡住你的其实就是几十道题
这几十来道题就是你最后的拦路虎
那还怕什么 干就完了
然后就对这几十道题发起总攻击
反复刷 不停刷 刷到忘我 刷到形成肌肉记忆
刷个四五遍 反正一遍下来也花不了太长时间
每次面试前他们更是你的重点关注对象
突击的刷他个两三遍
面试前 对于那些非疑难杂症题
可以就直接复习看他的思路就行了
可以通过力扣客户端
或者自己总结的思维导图
或者笔记
只要刷出肌肉记忆 面试不费吹灰之力 skr~
经验之谈
下面结合我实际面试过程中的一些经历
有一些关于面试时候手撕算法的一些思考
1.面试的时侯面试官可能还会叫你手撕一类题 就是那些非leetcode题 比如叫你手撕一个单例模式 手撕一个快排 手撕一个生产者消费者等等这些计算机基础方面的题 我有专门总结一个文档 有需要的小伙伴可以后台私聊
2 .面试的时候主动的和面试官交流 不能面试官出完题 就一个人闷头在那里写 因为面试官是会代入实际工作时的情景的 如果你写题的时侯和他一点交流也没有 那万一把你招进去了以后对需求交接的时侯是不是也是这样的状态? 这个也是我在面试的时侯听面试官提的意见
3.还有一个套路就是如果这道题对于你来说你做过或者你觉得很简单 此时千万别提起键盘就秒杀它,面试官肯定看出你刷过这道题 这样的话他可能对你的印象分就加不了多少 你至少应该思考片刻 或者假装思考片刻然后 表现出忽然豁然开朗的样子 再继续操作 会更好一点 让他知道你是思考过的
4.搞清楚题目的需求 面试中我碰到过一些比较难 需求比较复杂的题 他们不是力扣上的原题 可能看完一遍都觉得自己理解模棱两可, 这个时侯你在看完题目以后要把自己对题目需求的理解和面试官阐述一遍 确保自己的理解是没有偏的 否则的话一开始题目背景就理解错了 后面写出来肯定就对不了
5.如果你拿到题目觉得很懵 先去和面试官说暴力的解法 一来是不会一直卡在那 二来也许你说着说着你就有想法了
6.如果是笔试的话 先去熟悉输入输出 一般是在牛客上笔试 笔试前先去牛客的模拟笔试界面测试输入输出
7.如果你是搞c++的 那一些常用的STL容器和算法的api一定要搞熟练 像什么比较复杂的priority_queue 可以自己把常见容器的用法总结在一起 或者我后续会更新这样的一篇文章 感兴趣的小伙伴赶紧关注一波
7.刷题不是全部 面试也不只有算法题 虽然算法题很关键 但是真正能够然后拿下面试,征服面试官的 绝不能仅仅只靠刷算法题 而是各方面的基础知识 项目能力等等的均衡 也就是水桶效应里面的要保证没有短板 而且如果你想要拿下大厂 拿下sp 你必须要有个人在某一方面或多个方面的亮点和优势 如果有效的构建独特的个人优势 拿到sp 也有值得说道的地方 感兴趣的可以点个在看 老规矩 人过的话 我就分享
总结
ok 我的刷题法的核心思想就是上面这些
是不是感觉也没有啥太高深神秘的东西?
确实是这样 有效的办法
并不一定得是充满各种奇技淫巧
各种骚操作
他也可以是朴实无华
的 只要有用就行
但是还是想说明一下
这里只是提供一种刷题思路
它是适合我的
但是由于个体差异
不能保证它适合于每个人
如果你觉得这种方法对自己没多大作用
觉得我都是在说废话的话请轻喷😂😂
其实想要验证一下这种方法
适不适合自己的话很简单
你可以先用30道你没刷过的题作为测试样本
然后走一走上面的流程看效果怎么样
我想说的是
做各种东西都应该是有行之有效的方法论的 根据自身特点总结出属于自己的方法论才是最关键 总比无头苍蝇一样盲目的就开始上手开干好 对吧? 很多人觉的刷题是一项拼智商的活 但是我觉得找到一种有效的合适自己的方法论 再加上努力 是完全可以抵消和那些大神们的先天差距的
如果大伙觉得有用 有一点小小的收获
关于秋招 我还有很多压箱底的存货
一些 技巧和方法 和笔记
绝对是你在别的地方没看到过的
- 比如写简历
- 比如项目的准备
- 比如计算机基础知识的速成
- 比如非科班同学如果从0开始转行拿到BAT
- 比如如何找到第一份实习
- 等等
可以加我的微信ccc17862701790
可以免费提供指导