https://www.1point3acres.com/bbs/thread-435598-1-1.html
https://www.techielearning.com/blog/coding-interview-intro
https://www.1point3acres.com/bbs/thread-690073-1-1.html
https://www.1point3acres.com/bbs/thread-678970-1-1.html
https://www.1point3acres.com/bbs/thread-710035-1-1.html
https://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=678970&page=1&authorid=682747
- 边界条件,
- int 溢出,
- nullpointer,
- 负数,
- 非法输入
个人的刷题路径
- 刷easy题。主要寻找做题的感觉。
- 刷linkedlist, tree。 原因一是面试中这两类题考的频率较高, 原因二是刷这两类题有助于对递归的理解, 为后面刷DFS打下基础。
- 刷DFS。 DFS非常重要,因为大部分 brute force 基本都可以用dfs来求解。 刚开始刷DFS, 可以重点关注pemutation 和 combination的题目, leetcode 这两类题也挺多的。 然后开始总结, 去理解 “状态(state)” 这个概念,对于每道DFS问题, 要清晰的定义出 “状态(state)”, 以及状态如何转移, 这方面的基础可以为DP打下基础。
- 记忆化搜索。 也就是DFS + 记忆。记忆的存储通常用map或者set即可。
- DP。 记忆化搜索刷熟了,可以尝试开始刷经典的DP,理解状态 和 状态转移,尝试自己去写出状态转移方程。 尝试DP的两种实现方式 top-down(也就是记忆化搜索) 和 bottom-up
- 高频数据结构, stack, queue, heap。 这三个数据结构在面试中出现频率非常高。
- 其他重点专题: sliding window, sort(特别是快速排序 和 归并排序), two pointers, graph, bfs, trie, union find
个人的其他刷题方式,我通常会结合不同的刷题方式。
- 只看题,不写代码。 我通常会从brute force 开始求解, 然后逐步优化。 如果10-20分钟以内想不出解法, 直接去看答案了。
- 对于一道题, 精耕细作, 举一反三。 精耕细作是指 学习优秀代码, 一题多解 以及 如何从brute force推导到最优解,并且了解这个过程的思路是如何形成的。 举一反三是指看类似的题目, 总结共同特性。
- 参加竞赛。 训练快速做题, debug , 写代码的能力。 其他tips
- 刷题初期追求量,一道题不可花太长时间, 控制在30分钟以内
- 最好不依赖IDE, 训练直接在leetcode 页面写代码。
- 定期回过头总结刷过的题。
- 不要盲目刷题, 适可而止,刷够了,要转战到面试技巧上面, 面试技巧和刷题一样重要。(因为我就有一个面试挂在面试技巧上面, 非常后悔) 刷题感悟:理解 子问题。 对于每一个问题, 定义子问题是什么, 然后如何从子问题推导出原问题的解。 对于DFS, 就是穷举每个子问题。 DP就是因为存在重叠子问题。 贪心就是每次以子问题的最优解作为原问题的最优解。