转自:http://36kr.com/p/5084645.html
编者按:本文来自逆行求职(ID:nixingjihua)。
对所有求职技术岗位的童鞋来说,有这么一样东西恐怕做梦都会梦到【Leetcode】,绕都绕不过去的程序员刷题神器。
“哲学是世界观和方法论的统一,是具体科学知识的概括与总结。”
今天,逆行君就带你从世界观和方法论两方面走进“leetcode”
什么是leetcode
简单来说,leetcode是一个美国的在线编程网站,它收集了各大公司的经典算法面试题,用户可以选择不同的语言进行代码的在线编写、编译和调试。
Leetcode目前有450题(依稀记得去年还只有340多道啊),分为三个难度easy、medium、和hard。题目大致分为两类:
1、基础算法的知识。
这些题里面有大量的算法题,解这些题都是有套路的,不是用递归(例如深度优先DFS,广度优先BFS),就是要用动态规划(Dynamic Programming),或是拆半查找(Binary Search),或是回溯(Back tracing),或是分治法(Divide and Conquer),还有大量的二叉树,数组、链表、字符串和hash表的操作。通过做这些题能让你对这些最基础的算法的思路有非常扎实的了解和训练。
2、编程题。比如:atoi,strstr,add two num,括号匹配,字符串乘法,通配符匹配,文件路径简化,Text Justification,反转单词等等,这些题的Edge Case,Corner Case有很多。这些题需要你想清楚了再做,只要你稍有疏忽,就会有几个case让你痛不欲生,而且一不小心就会让你的代码会写得又臭又长,无法阅读。通过做这些题,可以非常好的训练你对各种情况的考虑,以及你对程序代码组织的掌控(其实就是其中的状态变量)。
为什么一定是leetcode
Leetcode是注重算法的刷题工具,在考算法的笔试面试中,碰见原题的概率可算是非常大:
@飞龙:面试向算法,感觉没有比leetcode更合适的训练方法了。短期刷用处也很大,如果你对代码有感觉的话,一些巧妙的解法你看一眼就会忘不了。
@anonymity:参加了一些公司的笔试,看到过leetcode上的原题或近似题。最后,从了某公司的美国总部软件工程师的offer。学生们项目经验少,只能考算法。刷题很有用。
@yuquan wang:
会leetcode,不一定能拿offer
不会leetcode,基本拿不了offer.
简而言之,就是,leetcode到底要怎么刷?
刷题的顺序,可以按不同的难度等级练习,先把easy的题目练完,再进阶medium,最后的hard就量力而为。广度优先的练习会让你快速掌握大部分题型,这样应对突发的面试笔试需求也可以信心十足,不会出现还没有练过的地方。
还不错是不是。
当然,要是按编号刷题太无聊,你也可以按Tag进行练习,举个例子,比如复习链表的内容,就选Linked List这部分的23个题目,刷完之后可以再总结一下常用的方法和数据结构构造方式。Tag分类在网页右边,如图:不过按Tag来刷,也可能会在惯性思维下,去想关于Tag的算法。比如138. Copy List with Random Pointer(深拷贝链表),Tag:Hash Table。尽管是一个hard的题目,但是已经提示hash表,怎么样都会想到建立映射关系(而且目前最好的解法并不是使用的hash table)。
最后提供一种综合性思路,也就是在各个Tag分类里按不同的难度刷题,这样就既有广度也有深度了。
我们还想给你一些小技巧
01 善用Github
不少人都会一边做Leetcode的题目一边在Github上repo,这样不仅对自己的解题思路有所记录,还能方便查找。不少刷Leetcode的高手,他们的答案也是写在自己的Github上,你也可以通过Github成功找到他们。
02 善用Leetcode的讨论区
同一道题的解法往往不止一种,甚至思路和方式都会完全不同,例如这位同学所说:“边刷边感叹天外有天,比如有道很简单的一个int array只有一个数只出现了一次,其他数都是出现了两次,找出只出现一次的数。看到讨论区的答案是把所有element XOR起来,顿时膜拜” 所以一般很简单的题,也有必要看看讨论区的优秀答案,毕竟提升自己的算法水平才是正义目标啊。
重点,90%同学都不知道的讨论区在的正确打开方式:
从每道题目下方的Discuss按钮里点进去,才是每道题对应的讨论!
03 徒手写代码的能力
很多同学在Leetcode上编得风生水起,但在笔试面试中遇到面试官拿出一张A4白纸,可能就懵逼了,改改涂涂半天写不完整。这个时候徒手写代码的能力就尤为突出了,无论你是先手写完代码再敲到网页上,还是代码AC(通过)后再默写一遍,徒手代码能力都是值得训练的,这也是你的整体思维和架构能力的体现。
04 善用碎片时间
有很多同学由于实习或者其他原因没有办法拿出大段时间来刷leetcode,这里为实习/工作/研究僧提供一个“一天一题时间表”:
1、早上起来出门前,迅速看一道题。
2.在拥挤的交通工具上,超脱自己,“冥想”题目。
3. 题目so easy,手机提交。
4. 短时不能通关?那就一直放在脑子里面想,到了公司/实验室,基本答案就可以动动手写在电脑上了。
5. 如前文所说,将思路和解决方案放到github上。
6. 晚上睡觉前,反思一下是不是最优解法,有时间的话看看discuss,没时间,把自己的解法理顺了,涉及的知识点再过一遍脑子。
05 菜鸟小白专用技巧栏目
对于基础不扎实的菜鸟选手,逆行君并不推荐按照前面提示的难度/tag进行刷题操作,有可能受思维暗示的影响不说,效率也会比较低下。
第一次刷,首先攻克array,string,tree,linkedlist,math这五个tag,好处在于可以迅速的在规避思维暗示的同时,迅速巩固数据结构的知识,或许还能掌握某种数据结构的小技巧。
每个tag内部就按照easy-medium-hard的顺序做,这样最开始一天刷10道easy,后面熟了这个数据结构一天也能刷5道难题,不会在初期被挫的刷不下去,培养一种刷题的“爽”感。
这个顺序完成之后,你已经完成了25%以上的进度条了,之后翻转顺序,从hard向easy进行刷题,开始会有点小虐,但后面就会效率奇高。刷完第一遍之后,就可以愉快的进行全tag刷题round 2了~
免费题解在这里
为了保证大家的刷题心情,大部分的题目的答案整理及分析,我们都给准备好了,画风是这样:
更多题解可以关注逆行求职(id:nixingjihua),回复leetcode获得。