不宜太久
主要还是看自己掌握程度,我见过刷200题就上岸的,也见过刷1000题面试答不上来的,所以刷题就刷题,别关乎时间,别给自己设限。
然后,分阶段,根据不同侧重点去刷题,不管对找工还是学习,都有用。
一、初学阶段:
连续刷题1-2周,大概刷个50题左右,先去了解算法与数据结构(比如双指针,哈希,链表,字符串)的应用。
在这个阶段,你可能会觉得很难受,没有方向也没动力,这时候你需要多看多抄别人的代码,学别人的思路。
实在没思路的,可以根据这套《新手必刷编程50题》免费练习,不多不少刚刚好50道,设计基本数据类型,判断语句,数组循环,字符串与循环,栈与队列,简单递归几个知识点。
①基本数据类型
https://www.lintcode.com/problem/1
https://www.lintcode.com/problem/37
https://www.lintcode.com/problem/764
https://www.lintcode.com/problem/1300
②判断语句
https://www.lintcode.com/problem/23
https://www.lintcode.com/problem/766
https://www.lintcode.com/problem/145
https://www.lintcode.com/problem/1141
https://www.lintcode.com/problem/478
https://www.lintcode.com/problem/283
③数组与循环
https://www.lintcode.com/problem/25
https://www.lintcode.com/problem/214
https://www.lintcode.com/problem/485
https://www.lintcode.com/problem/539
https://www.lintcode.com/problem/297
https://www.lintcode.com/problem/484
https://www.lintcode.com/problem/9
https://www.lintcode.com/problem/220
https://www.lintcode.com/problem/407
https://www.lintcode.com/problem/807
https://www.lintcode.com/problem/463
https://www.lintcode.com/problem/298
https://www.lintcode.com/problem/479
https://www.lintcode.com/problem/46
https://www.lintcode.com/problem/768
https://www.lintcode.com/problem/1334
https://www.lintcode.com/problem/767
https://www.lintcode.com/problem/235
https://www.lintcode.com/problem/53
https://www.lintcode.com/problem/50
④字符串与循环
https://www.lintcode.com/problem/8
https://www.lintcode.com/problem/491
https://www.lintcode.com/problem/146
https://www.lintcode.com/problem/422
https://www.lintcode.com/problem/353
https://www.lintcode.com/problem/936
https://www.lintcode.com/problem/241
https://www.lintcode.com/problem/13
https://www.lintcode.com/problem/1535
https://www.lintcode.com/problem/1343
https://www.lintcode.com/problem/133
⑤栈与队列
https://www.lintcode.com/problem/263
https://www.lintcode.com/problem/423
https://www.lintcode.com/problem/495
https://www.lintcode.com/problem/492
https://www.lintcode.com/problem/771
⑥简单递归
https://www.lintcode.com/problem/366
https://www.lintcode.com/problem/66
https://www.lintcode.com/problem/67
https://www.lintcode.com/problem/68
二、中级阶段
此时简单逻辑已经理清楚,更多的是注重算法上的逻辑运用。这个阶段你可能需要刷50-80题,重点去掌握:链表、二分法、二分答案、相向双指针、宽度优先搜索、二叉树遍历、二叉树&分治法、二叉搜索树、深度优先搜索、坐标型动态规划、背包型动态规划、匹配型动态规划等。
主要还是锻炼你的逻辑和熟练程度,在不处理过于复杂的问题的情况下,能够提高自己的code能力和质量。
同样,根据这个思路可以试着去刷《进阶必刷编程80题》,这些题我自己都刷过,覆盖面还是非常广的,刷完去面试中小企业基本没啥问题。
链表:
https://www.lintcode.com/problem/35
https://www.lintcode.com/problem/36
https://www.lintcode.com/problem/450
https://www.lintcode.com/problem/228
https://www.lintcode.com/problem/102
https://www.lintcode.com/problem/103
98 · Sort List - LintCode
二分法:
https://www.lintcode.com/problem/14
https://www.lintcode.com/problem/28
https://www.lintcode.com/problem/75
https://www.lintcode.com/problem/457
https://www.lintcode.com/problem/458
二分答案:
https://www.lintcode.com/problem/183
https://www.lintcode.com/problem/437
https://www.lintcode.com/problem/319
https://www.lintcode.com/problem/963
相向双指针:
https://www.lintcode.com/problem/56
https://www.lintcode.com/problem/57
https://www.lintcode.com/problem/58
https://www.lintcode.com/problem/363
https://www.lintcode.com/problem/539
https://www.lintcode.com/problem/6
https://www.lintcode.com/problem/32
https://www.lintcode.com/problem/521
https://www.lintcode.com/problem/1870
https://www.lintcode.com/problem/328
https://www.lintcode.com/problem/547
https://www.lintcode.com/problem/406
宽度优先搜索:
https://www.lintcode.com/problem/433
https://www.lintcode.com/problem/615
https://www.lintcode.com/problem/630
https://www.lintcode.com/problem/120
https://www.lintcode.com/problem/178/
https://www.lintcode.com/problem/278
https://www.lintcode.com/problem/787
二叉树遍历:
https://www.lintcode.com/problem/66
https://www.lintcode.com/problem/67
https://www.lintcode.com/problem/68
https://www.lintcode.com/problem/69
https://www.lintcode.com/problem/73
https://www.lintcode.com/problem/72
二叉树&分治法:
https://www.lintcode.com/problem/468
https://www.lintcode.com/problem/854
https://www.lintcode.com/problem/596
https://www.lintcode.com/problem/628
https://www.lintcode.com/problem/597
二叉搜索树:
https://www.lintcode.com/problem/902
https://www.lintcode.com/problem/915
https://www.lintcode.com/problem/85
https://www.lintcode.com/problem/95
https://www.lintcode.com/problem/689
深度优先搜索:
https://www.lintcode.com/problem/1909
https://www.lintcode.com/problem/634
https://www.lintcode.com/problem/802
https://www.lintcode.com/problem/652
https://www.lintcode.com/problem/169
https://www.lintcode.com/problem/425
https://www.lintcode.com/problem/33
坐标型动态规划:
https://www.lintcode.com/problem/114
https://www.lintcode.com/problem/115
https://www.lintcode.com/problem/1861
https://www.lintcode.com/problem/1827
https://www.lintcode.com/problem/76
https://www.lintcode.com/problem/109
https://www.lintcode.com/problem/1702
背包型动态规划:
https://www.lintcode.com/problem/669
https://www.lintcode.com/problem/564
https://www.lintcode.com/problem/92
https://www.lintcode.com/problem/1915
https://www.lintcode.com/problem/1800
https://www.lintcode.com/problem/125
https://www.lintcode.com/problem/440
https://www.lintcode.com/problem/562
https://www.lintcode.com/problem/563
https://www.lintcode.com/problem/724
三、 代码实现&提升代码质量
如何更快更好的做到代码实现,刷一题抵得过别人刷三题,建议不使用题海战术,而是找方法提升刷题质量。这里浅浅的分享一份刷题模板
浅浅举个例子
面试中经常会遇到双指针,有了思路不会解怎么办?
使用条件
滑动窗口(90%)
时间复杂度 O(n)(80%是双指针)
要求原地操作,只可以使用交换,不能使用额外空间(80%)
有子数组 subarray / 字符串 substring 的关键词 (50%)
有回文 Palindrome 关键词(50%)
复杂度
时间复杂度: O(n)
- 时间复杂度与最内层循环主体的执行次数有关
- 与有多少重循环无关
空间复杂度: O(1)
只需要分配两个指针的额外内存
代码模板
Java
Python
同样的方式套用变形题再试试看,你应该会有不同的体会
- 两数之和VII(同向双指针)
其次,实现代码之后,不断优化自己的代码质量,这里分享提升代码质量的12个技巧
Coding Style
- 二元运算符两边加空格,单元运算符不加空格
- 花括号和 for, if 之间要加空格(Java),圆括号和 if 之间要加空格
- 用空行分隔开不同的逻辑块
- 逗号后面加空格
Readability
- 函数名和变量名用1-2个单词作为名称
- 确保一个函数内部不超过 3 层缩进(indention)
- 多用子函数来减少入口函数的代码量
- 多用 continue 少用 if
Bug Free
- 不管有没有可能出问题,都要对入口函数的参数进行异常检测
- 访问一个下标的时候,一定要确保这个下标不会越界
- 访问一个对象的属性或者方法时,一定要确保这个对象不是空
- 不用全局变量
四、有针对性的刷大厂真题
不同大厂在题库设定和考察思路上会有些许不同,但万变不离其宗。如果你是奔着上岸去的,建议多刷心仪公司的算法题,这里是我整理的大厂面试高频算法题,其中就包含了BATJ等众多一线大厂的算法真题及详解,希望对你有所帮助。
字节
腾讯
…
掌握至此,不用刷500题,也能轻松收获大厂offer