编程题训练逻辑思维能力,这是程序员需要具备的核心能力。校招还是比较看重算法能力的,刷题时建议分类型刷,先做简单题,再做比较困难的题;先刷数据结构相关的,然后是剑指offer的其他题目;刷题过程中应努力发现题目间的关联,从中总结出该类题型的一些模板或通法。刷题过程中只看重我理解了该解法
,或是只看重我把这个题目做出来了
,都是不对的,应该理解和实操并重,这样就能达到只刷少量经典题就能迅速提升自己编程水平的效果。
模块篇
模块篇这部分,同学们按照自己掌握的知识点去找对应知识模块的题目去联系即可
数据结构篇
数组、字符串、哈希表
数组、字符串、哈希表作为最常使用的数据结构,往往大部分问题都会用到,编程语言也提供了大量的api可供调用,我们应熟悉用循环的方式访问并操作这些数据结构,通过这些题目的练习,熟悉最基本的循环语句的写法。
https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880
https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711
https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
https://www.nowcoder.com/practice/3d8d6a8e516e4633a2244d2934e5aa47
https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
链表
链表题目的核心在于链表的遍历,我们应熟悉迭代遍历链表的思路,另外链表也具有天然的递归性,所以递归的方式也能遍历链表,会给链表的问题带来一些巧妙和简洁的解法。除此之外,应关注链表的问题中经常使用的虚拟头节点、双指针等技巧。
二叉树
二叉树的重点依然在于二叉树的遍历,应熟悉二叉树的几种遍历方式,以及那些特殊的二叉树的性质、如堆、BST树、AVL树等。二叉树的题目应充分利用递归,把问题分解为子问题,相信做完这些题目后,就能熟悉递归了
二叉树的最大深度 √
重建二叉树 √
栈与队列
我们需要了解栈与队列这两个线性数据结构的性质,并充分利用这些性质解决问题。
算法篇
算法公开课+优选算法课(视频+答案的形式)
查找和排序
查找和排序是最基础的算法了,需要在面试场景下能熟练的写出那几种排序算法和二分查找的代码。并通过这两类经典的算法问题理解算法设计中的时间复杂度等概念,熟悉分而治之、设计新的数据结构以及二分排除 等解决问题的常见计算机思维。
动态规划
对于形如已知f(1)=1,f(n)-f(n-1)=1,求f(n)
的题目,我们高中时所学的数学方法,往往是想办法求出f(n)关于n的公式,比如上题就是得出f(n)=n+1
,然后把n带入n+1
就能求出f(n)的值,但得益于计算机强大的运算速度和存储能力,编程解决此类问题的方法往往是根据f(1)和递推公式求出f(2),然后把f(2)存下来。接下来下一轮循环就能用保存的f(2),计算出f(3)了,直到计算出f(n),我们把这种方法叫动态规划,上文中的f(n)-f(n-1)=1
则称为状态转移方程。
回溯
我们经常会遇到需要在递归调用的上下文之间传递状态的问题,对于简单的情况,我们可以通过递归函数的传参来传递这种状态,但复杂情况下,我们就需要在递归函数中用额外代码维持那个状态了,我们把这种方式称为回溯。
图论算法
对于链表和树这种数据结构,我们更关心对象的存储和查询,但对于图这种数据结构,我们更关心节点之间的拓扑关系,我们应熟悉在图中找最短路径、最小生成树的算法
其他算法
除了上述解决编程问题的常见思路之外,面试中遇到新题,还有一些其他的考虑问题的角度,包括贪心、数学方法、模拟方法、位运算、前缀和等,此处给出常见问题。
综合篇
刷完上面的题目之后,同学们基本也有了一定的代码基础和算法思路,那么接下来,就可以综合刷题,可以刷下面这里的算法,这里同学们可以先刷简单的,再刷中等的