刷题小白入门攻略

11 篇文章 0 订阅

本文适合人群:题量200以下,周赛无法稳定做出1.5题的入门级选手。

本文是CSDN关于活动《刷简单的题也很吃力怎么办》的主题征文,首发CSDN。

1. 刷题前的心理准备

在开始刷题之前,我希望大家都能认识到一点:没有人生下来就会刷题。所有的高手或者大神,都是需要训练(长短就看天赋和基础),才能熟练掌握数据结构和算法,以及常见的题目套路。
所以,如果你之前没有接触过 Competitive Programming(NOIP, NOI, ACM, 蓝桥杯之类的比赛),那么对于刷题理所应当是几乎一窍不通的

但好消息是,刷题是一种可以被训练的技能,它甚至相比于一些普通技能(弹琴,画画,木工,电焊),还有着一些独特的优势:

  1. 易于开始。有电脑和网络就能训练。如果你没有私人电脑,那么可以去学校或者图书馆的机房免费练习。
  2. 反馈迅速。这是非常关键的一点,只有及时反馈才能带给你成就感。电子游戏让人类上瘾也是同样的原理。题解正确的情况下,一分钟内系统就可以给到你正向反馈,刺激你的多巴胺分泌,使你感到幸福和满足。同时,如果你的答案还有欠缺,系统也可以快速给到反馈,告诉你你的算法可能哪里出错,以及无法覆盖到的 Test Case。
  3. 资源丰富。互联网上教你怎么刷题的文章或者视频,或者每道题的题解都多到不能再多,只要你会用搜索引擎,就可以找到有帮助的资料。
  4. 标准明确。你的答案对不对的标准非常清晰,不会改变,对就是对,错就是错。
  5. 收益显著。对于 IT 从业者来说,刷题带来的经济收益极其明显。特别是北美找 CS 工作,只有会刷题才能找到工作,假设你刷了1000题找到了一个年薪 $100K 的工作,刷一道题的收益就等于$100。

种一棵树最好的时间是10年前,其次是现在。练习刷题也是如此。

对于小白来说,我认为最重要的就是保持良好心态 + 建立正反馈 + 培养刷题习惯 + 及时输出


2. 刷题前的知识准备

在正式打开刷题网站之前,我建议你需要做到:

  1. 了解 List, Set, HashTable, Stack, Heap 和 Binary Tree 的基础概念。如果你不懂这些基本数据结构的概念,那么我觉得刷题对你来说太痛苦了,基本寸步难行。
  2. 选取一门你最熟悉的语言。如果没有熟悉的语言,那么我推荐 Python。Python 拥有广泛的函数库,并且代码结构清晰简单,可以极大地节省你的刷题劳动量和痛苦程度。
  3. 对你选择的语言,做到熟悉基础的数据结构API,比如给你一个数组,你需要知道:
    • 怎么返回数组长度?
    • 怎么往数组里添加元素?
    • 数组如何切片?
    • 怎么找数组的最大值?
    • 如何返回所有子数组?
    • 如何给数组排序?

3. 正式练习刷题

3.1. Codewars

我个人推荐 0 基础小白不要从 LeetCode 开始,因为难度偏大而且趣味性低,短时间内很难建立正反馈。

我的建议是 Codewars.com,类似 LeetCode 的免费刷题网站,但是趣味性更强,而且题目之间等级区别更明显。

Codewars 题目分级从 Kyu 8 到 Kyu 1 一共八个等级,LeetCode只有Easy,Medium和Hard的区别。

Kyu 8 和 Kyu 7的题目极其简单,完美适合纯小白上手,基本不涉及任何算法,但可以训练你上文使用基础的数据结构API和培养基础的刷题感觉(如何把题意翻译成代码)。

举例:

Disemvowel Trolls | Codewars 是一道 Kyu 7的题,让你去掉输入字符串里的元音字母。
题意非常简单,就是纯粹的模拟题,能一比一把题意翻译成代码实现就算你做对。(这也是大多数LeetCode周赛第一题的要求,单纯模拟即可)

Codewars 每做完一道题都可以得到对应的分数,所以你练习的时候可以看到自己的得分库库猛涨,建立正反馈。(Tips: 做完一道题之后给它评分,可以给你自己额外加一分)

Codewars 的缺点就是全英文界面,以及题解里有过于崇尚一行解的不良风气。

3.2. LeetCode

当你 Codewars 的7级和8级题目不成问题时,就可以开始训练 LeetCode了。LC的好处在于,有中文界面,有丰富题解(包含答案和详细解释),还有面试真题。

不推荐的小白刷题顺序:从题号为1的题目开始,按顺序往后刷。

推荐的刷题顺序:

  1. 每天选一个 Topic,比如数组,模拟,栈,二叉树等等
  2. 只做这个 Topic 的题。其实做题最难的就是知道用什么数据结构或者算法来解题,代码实现其实都比较模板化。对于小白,建立一个大概的感觉就行,知道什么样的题目可以用什么数据结构和算法来解答。而且同 Topic 的题目之间会有联系,能大大提高刷题效率。
  3. 按照通过率从高到底排序,从最简单(通过率最高)的题目开始练习。小白千万不要拿 Hard折磨自己,任何事情想要坚持下去都得建立正反馈,你得得到好的结果,才能分泌多巴胺,让你感到快乐和满足。天天对着 Hard 死磕你不难受吗?
  4. 认识到一开始做不出来很正常。比如没有人教过你二叉树前序遍历怎么写,你自己不会写不是很正常的一件事吗?不要做不出来就死磕,完全没有意义的。我推荐是对于 Easy 题,五分钟写不出来就看答案,Medium 可以想十分钟,Hard 请小白直接跳过。
  5. 写出来一道题之后,请及时输出。根据费曼学习法,掌握知识的最好办法就是把它教给别人。比如某书上有博主组建了讲题群,每天讲解一道 ta 刷过的题目;再比如本博客一开始也是我个人想要记录刷题历程的起点,现在四年过去了渐渐地也有了100W 的访问量了。
  6. 写出来一道题之后,请练习相关或相似的题目。比如你不会写二叉树前序遍历,看了答案之后学会了递归的写法。那么接下来你可以练习二叉树的中序遍历,假设这你也还没学会,五分钟后请学答案。现在有了前序遍历和中序遍历,你应该可以自己写出来后序遍历了吧。如果还不行,那么也没关系,我们明天再来一遍,看看你能不能独立做出来这三道题。类似的,二叉树层序遍历你学会了,那么之字形遍历,二叉树的右视图都是相同的举一反三的道理。怎么找相关的题目呢,首先 LC 会推荐,其次你可以搜索关键词 题号 + 相关题目。

按照这个方法,我相信你一天刷个5到10题不是问题。

另外我推荐装一个Chrome浏览器插件用于帮助小白准确识别题目难度,它是免费的,然后可以给每道题目一个难度分,而不是单纯的Easy or Medium。

4. 我自己的刷题历程

我自己是四年前开始刷题的,收到第一份 Master Offer 的那一天就开始了,因为提前做过功课,知道想在北美找工的话,练习刷题是绝对逃不过的一关。

我花了六个月,按照上文的方法,终于在登陆🇺🇸之前刷了900道题,受益匪浅。之后的算法面试(我面过五六十轮Coding,只有一道Hard)从来没挂过,OA 基本都是秒最优,刷题能力成了我面试时最大的优势。

我0.3基础起步,先从 CodeCademy 开始学习 Python 基础语法,然后网课学习数据结构,Codewars 练习基础数据结构操作,LC 刷题,然后写博客输出记录。前两百题我都是懵逼状态,自己写基本写不出来,但是看了答案之后就能懂,然后能举一反三应用到其他的题目。后面慢慢地就开窍了,越刷越顺。

刷到啥时候我觉得对于北美找工就差不多了呢?一亩三分地上随便找道公司 OA,大概中等难度左右的,你能独立写出来就说明可以应付大多数公司的面试了。真人面试准备其实也差不多,大多数公司的面经里都会告诉你题目,你完全可以提前准备好自己的解,面试时如果面经命中,那么接下来就是你的表演时刻了。但是如果你刷题能力不过关,自己写不出来,那么给你再准确的面经题也没啥帮助。。。


5. 总结

刷题是门手艺活:保持良好心态 + 建立正反馈 + 培养刷题习惯 + 及时输出,我相信小白也可以慢慢进化成高手。


 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值