这样刷题,贼惬意!
大家好,我是周末也没有闲着的二哥。
之前不是给大家分享了一份 Java 版的 LeetCode 刷题笔记嘛,很多小伙伴留言说刚好需要,对我这种大公无私的分享精神表示敬佩(嘘。
但由于时间比较紧张,PDF 版里只包含了前 50 道,所以我感觉还欠大家 250 道。所以趁着这个周末,靠着惊人的毅力,我又整理了 50 道 Java 版,从 51 道到 100 道。整理完的那一刻,真的是对天长啸, 捶胸顿足,终于舒了一口气,终于松了一口气。可怜我的右手食指,因为点击鼠标左键过于频繁,似乎有点隐隐作痛,太难了。
由于要窝在家里整理这份 PDF,周末就没有时间陪女儿和老婆出去玩,她们俩去隋唐植物园玩了,把我一个人扔在家里,好残忍!!!呜呜呜
说实话,洛阳今天的天气真不错,虽然不能陪老婆和女儿出去赏牡丹呼吸新鲜空气,但想到这份刷题笔记会帮助到不少的小伙伴,我心里就好像盛开了一园子的牡丹一样,姹紫嫣红!
我认识一个 ACM 成绩特别优异的大佬,LeetCode 对他来说就是小试牛刀;我甚至认识一个天赋极强,上来就 beat 100% 的大神。
但我认识更多的是,一开始刷 LeetCode 极其吃力,有一种劳资为什么这么愚钝,刷了不到 10 题就想放弃,心里琢磨着“刷 LeetCode 有用吗”的普通人,包括 me 在内。
真的有必要刷题吗?
必要肯定是必要的,毕竟“工厂”就喜欢这一套筛选机制,尤其是大厂!这就和古代的很多才子,都特么不喜欢八股文,写点风雅的诗词它不香吗?但能怎么办?想要参加科举出人头地,就得这么干!
那怎么刷才能轻松点,才能高效点呢?
我的心得就是简单粗暴:从易到难,一遍一遍地刷,尽量使用自己熟悉的编程语言,比如说 Java 程序员尽量用 Java 来解题,这样刷题的幸福感也会提升很大一截。用自己不熟悉的语言可以刷,但时间成本就很高。就这样不断地坚持,刷完 10 道题,然后 50 道,100 道,刷题的功夫就有了本质上的提升。
当然了,刷题仍然是需要有技巧的,不能闷着头吭哧吭哧地刷,可能会遇到很多阻碍。
1)如果不是天赋异禀,不要怕,一开始就是抄题,先把别人的解题思路照着敲出来,比如说大家可以使用我分享的这份纯 Java 版的 LeetCode 刷题笔记,前后有 300 道,几乎每道都有多种解题思路。
反正我一开始学 Java 的时候就是各种抄 demo,demo 抄得多了,大脑对代码产生记忆了,再去看视频、书籍学习就会感觉轻松得多!
刷 LeetCode 也是这么个理,不要觉得不好意思,抄多了,思路就慢慢有了。虽然是个笨方法,但管用。
2)刷的题多了,尽量控制一下刷题的时间,掐个点,不能让自己一直想、一直写下去,如果半个小时没有解出来,就果断放弃,去背别人的答案,不要觉得不好意思,等到真的熟了,再去想自己的解题思路。
在我们小的时候,学习就是靠背,拼音要背,乘法口诀要背,一样的道理,背的滚瓜烂熟,才能在应用的时候第一时间就想得到。甚至说,就省去了想的时间。
想一下,是不是这样,当我们背会了 1+1=2 后,要得出 10+10=20 是不是就容易多了!
3)代码尽量要规范一点,不要以为只要把题解出来就行了,还是应该保证代码优雅的姿态。
4)参加笔试之前,一定要保持手感,不能说题解过了就以为自己真的会了,时间长了是会忘记的。
5)一开始刷题不要追求量,非要把所有的题全部刷完,光 LeetCode 上就有 1000 多道题,所以没必要全部刷完的。可以按照下面这个类型来刷就可以了。
数组-> 链表-> 哈希表->字符串->栈->队列->树->回溯->贪心->动态规划->图
一开始,刷 100 道题就差不多了。国内的刷题网站有 LeetCode、LintCode、牛客网,大部分题都是类似的,有部分题需要充钱才能解锁,可以理解,毕竟网站也需要商业化才能长期维护和发展。
我在知乎上发现了一位匿名用户整理的 100 道面试高频算法题(出自 LintCode,涉及到阿里巴巴、字节跳动、腾讯、百度、美团、Google、Facebook、Microsoft 等大厂,题目类型有二叉树、哈希表、二分法、宽度优先搜索、深度优先搜索、贪心),地址我贴到了原文链接,大家可以点击去查看。我把有题解的题目列一下(括号中为题号)。
1、连接字符串(876)
2、同和分割数组(877)
3、有效的括号字符串(1089)
4、路径和 IV(1098)
5、数组评分(1168)
6、删除字符(244)
7、矩阵中的最长递增路径(305)
8、组合新数字(1341)
9、最大点的集合(1356)
10、最短休息日( 267)
11、中位数( 339)
12、移除箱子( 1180)
13、最小分解( 871)
14、等差切片( 982)
15、祖玛游戏(1211)
16、生命游戏( 1301)
17、字符至少出现K次的最长子串(1261)
18、整数替换(1259)
19、拆分子数组(1251)
20、考试策略(273)
21、字符串划分(328)
22、区间极值异或(346)
23、月份天数(1141)
24、关联查询(1145)
25、第k大元素(5)
26、LRU缓存策略(134)
27、图是否是树(178)
28、序列重构(605)
29、单词拆分(107)
30、最多有k个不同字符的最长子字符串( 386)
31、三数之和(57)
32、颜色分类(148)
33、单词接龙(120)
34、验证二叉查找树(95)
35、搜索旋转排序数组(62)
36、买卖股票的最佳时机(149)
37、滑动窗口的最大值(362)
38、二叉树的锯齿形层次遍历(71)
39、两个链表的交叉(380)
40、复制带随机指针的链表(105)
41、二叉树的后序遍历(362)
42、二叉树的所有路径(480)
43、根据前序和后序遍历构造二叉树(1593)
44、对称树(1360)
45、找出树中每行的最大值(1195)
46、寻找重复的子树(1108)
47、两数之和(56)
48、最长回文串(627)
49、两数组的交集(547)
50、数据流中第一个唯一的数字( 685)
51、两数和 II-输入已排序的数组(608)
52、经典二分查找问题(457)
53、搜索旋转排序数组(62)
54、寻找峰值(75)
55、最长上升子序列(76)
56、岛屿的个数(433)
57、序列重构(605)
58、拓扑排序(127)
59、课程表(615)
60、最大子数组差(45)
61、子集(17)
62、子数组之和(138)
63、电话号码的字母组合(425)
64、k数和 II(90)
65、因式分解(652)
66、会议室 II(919)
67、俄罗斯套娃信封(602)
68、最大乘积(304)
69、加油站(187)
题是刷不完的,不一定非要刷 300 道题,1000 道题才能找到工作,毕竟这事还涉及到运气,如果面试官恰好问到的题都是你解过很多遍,倒背如流的,那么恭喜你,上岸几乎是板上钉钉的事。当然了,面试过程中,也不是必须每道题都 必须答对,才能拿到 offer,有一些是看面试官对你的好感足不足。
刷的题多了,自信心就上来了,面试的过程中也就不会怵得慌。
刷题除了有助于我们丰富思维方式之外,还有助于锻炼编码的基本功底,希望这些技巧能帮助到大家,希望我辛辛苦苦整理的这份 Java 版的 LeetCode 刷题笔记能帮助到大家。
大部分小伙伴应该都还处在大学阶段,很有必要趁早把题刷起来。一开始可能会比较难,千万别灰心,好好做,会有收获的。
我是手指头疼的二哥,呜呜呜
记得给二哥加个星标哈,我们下期见~