For learning

就是拿lc原题考都有大把人答不出来更不用说变形或者新题了刷题更多是练习编程能力抽象思维逻辑思维大厂之所以要考刷题而不像国内那样更多聚焦业务问题是因为对数据结构和算法的理解和应用基本反映了一个码农的潜质尤其是到后期初期可能绝大多数人的工作是用不到数据结构和算法的但是后面要开始接触到软件架构要把控全局代码时时间复杂度和空间复杂度其实就非常重要了直接影响到你设计的软件效率借用地里之前以一位辈说的话刷题厉害的就三种人:
1特聪明的
2特勤奋的
3特别喜欢这家公司的把所有面经和tag题都背下来了
这三种人公司招哪种都不亏

其次,每个人对于“刷题”这件事情的定义是不一样的。比如,有些同学认为把题目做一遍就算刷题了,而对于刷题界的老炮们来说,挑到那最精髓的20%的题各种姿势虐,远比750道题穿肠而过,来的有意义得多。

最后,每个人的知识储备,可用时间与目标公司都不一样。有些猛男一天能把20道高难度题目刷的气定神闲,有些菜鸡一周刷5道中等难度就已经生活不能自理。与其追求刷题数量上的多,不如去找到让自己最高效的刷题节奏。

和所有领域的猛男一样,成为一个刷题猛男的关键在于持久。保持一个良好的状态加上持之以恒,就算是菜鸡也终有蜕变成猛男的一天。

为什么要刷题?
我想大部分newgrad对这个问题没有任何疑惑
但对于已经有很多年工作经验的人
这个问题是一个必须想明白的问题否则会极大的影响自己刷题的motivation一边刷一边愤恨道:我N年的经验根本不看就考这些破算法题?
你们谁工作用过这么复杂的算法?报着这个心理刷题能刷成啥样可想而知做题和工作经验的关系可以类比成下面这个问题:“男人看女人到底是更看重外貌还是思想?”
答:思想决定我会不会和她交往而外貌决定我愿不愿意了解她的思想!
交往=雇佣男人=公司女人=你外貌=做题思想=工作经验一目了然了吧?
考做题是对一个程序员基本素养的考核如果这个不达标你的经验再多公司也不会要你
就比如你去面试国足你说你踢了10年球了, 人家先测你个百米速度你跑了半分钟, 那你踢几年球有意义吗只能说明你在低水平球队混了10年而已.
但一旦你刷题这关过了, all of sudden your experience starts to matter! 一个top university ms new grad 就算题目都秒他也拿不了GoogleT5, 但一个10年经验的题目秒的慢了点,也可以轻松拿T5所以工作经验非常重要但刷题也是非常科学的招人指标

要刷到什么水平?
版上大家很爱问一个问题到底刷到什么水平能拿offer
我试着以我的理解来回答下这个问题
单说以找工作为目标的刷题我把刷题分为4个阶段:

1. 不知道怎么刷题对很多概念比如BigODP都陌生每天纠结到底是看那个算法书/资料入门快

2. 在一个良好的IDE里做Medium题目只要愿意想一般都能做出来做不出来看答案也就懂了Hard也能做出不少除了有些复杂算法还在消化中算法上基本已经入门但脱离IDE写代码就有点发怵函数signature甚至函数名都老记错搞个string操作还得Google一下API非常依赖自动补全很多新人以及多年经验的老人可能都处于这个阶段

3. 除了偶尔遇到个Hard题得想很久基本平时刷LC非常comfortable同时能非常comfortable的在白板或者LC等网站的网页简单IDE里写代码写代码过程中不需要Google函数用法不依赖自动补全而且甚至觉着这么写比在IDE里还舒服

4. 在3的基础上一般题目都是20分钟一道写完基本扫一下一检查就可以bug-freeHard题噼里啪啦码一堆不管逻辑再混乱心里非常清楚自己码的是什么复杂度多少有没有优化潜力且非常自信自己码的是对的对于一次提交就AC是自己的基本要求对参加LCcontest(contest里都要求一次提交就AC否则罚时)等业余竞赛比较comfortable以我理解:

刷到3就可以去面试了较大概率拿下AmazonMS等二线公司offer
刷到4去面一线公司(FLGUAirPS)基本也有较大概率成功当然因为这种问题本来就不会有真理解我的回答仅供参考

-注重学习大家刚入职场肯定都是踌躇满志干劲十足恨不得一天把project就做出来第二天就能升职有斗志是好事但有时也会欲速不达把目光稍微放长远些focuson提高能力往往效果也不错

-有效的学习念书的时候获取知识的途径其实比较简单要学的都写上书了卖力读就好了工作不同于读书知识是不在书上的找知识有时候比学知识更困难推荐一个办法就是多oncall多debug尤其是刚进新组的时候

-好奇心&刨根问底做项目的时候遇到问题其实是好事情不用怕耽误时间静下心把问题想清楚弄明白rootcause

-交流沟通高效的交流沟通不只是一种态度而且是一种能力需要花时间和精力培养练习

-bebold&beproactive:积极主动的问问题积极主动的寻求帮助积极主动的争取机会积极主动的抗争不公

Algorithms to study:
merge sort
quick sort
breadth-first search
depth-first search
binary search

Data structures to study:
arrays/arrayLists
hash tables
trees
graphs
stacks/queues
heaps

Concepts to know:
big O
recursion

Think about different algorithm and algorithmic techniques (sorting, divide-and-conquer, recursion).
Think about data structures, particularly the ones used most often (Array, Stack/Queue, HashSet/HashMap/HashTable/Dictionary, Tree/Binary Tree, Heap, Graph, Bloom Filter, etc)

Algorithms, design patterns, data structures, recursions, binary tree questions.

These traits include:

Doing the right thing.
Striving for excellence.
Keeping an eye on the goals
Being proactive.
Going the extra mile.
Doing something nice for others, with no strings attached.
Being friendly and approachable.
Valuing users and colleagues.
Rewarding great performance.
Being humble, and letting go of the ego (at least sometimes).
Being transparent, honest, and fair.
Having a sense of humor.

系统性的分类学习
先学会看懂答案
注意代码风格的养成
反复训练
详细的笔记
提升讲题能力
任务分配管理

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store