编程题训练逻辑思维能力,这是程序员需要具备的核心能力。校招还是比较看重算法能力的,刷题时建议分类型刷,先做简单题,再做比较困难的题;先刷数据结构相关的,然后是剑指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
链表
链表题目的核心在于链表的遍历,我们应熟悉迭代遍历链表的思路,另外链表也具有天然的递归性,所以递归的方式也能遍历链表,会给链表的问题带来一些巧妙和简洁的解法。除此之外,应关注链表的问题中经常使用的虚拟头节点、双指针等技巧。
反转链表
合并两个排序的链表
合并k个已排序的链表
判断链表中是否有环
链表中环的入口结点
链表中倒数第k个结点
链表相加
判断一个链表是否为回文结构
二叉树
二叉树的重点依然在于二叉树的遍历,应熟悉二叉树的几种遍历方式,以及那些特殊的二叉树的性质、如堆、BST树、AVL树等。二叉树的题目应充分利用递归,把问题分解为子问题,相信做完这些题目后,就能熟悉递归了
按之字形顺序打印二叉树 √
二叉树的最大深度 √
二叉树中和为某一值的路径(一) √
二叉搜索树与双向链表 √
判断是不是二叉搜索树 √
判断是不是平衡二叉树 √
在二叉树中找到两个节点的最近公共祖先 √
重建二叉树 √
栈与队列
我们需要了解栈与队列这两个线性数据结构的性质,并充分利用这些性质解决问题。
用两个栈实现队列
表达式求值
寻找第K大
数据流中的中位数
算法篇
算法公开课+优选算法课(视频+答案的形式)
查找和排序
查找和排序是最基础的算法了,需要在面试场景下能熟练的写出那几种排序算法和二分查找的代码。并通过这两类经典的算法问题理解算法设计中的时间复杂度等概念,熟悉分而治之、设计新的数据结构以及二分排除 等解决问题的常见计算机思维。
二分查找
二维数组中的查找
数组中的逆序对
寻找峰值
最小的K个数
动态规划
对于形如已知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
则称为状态转移方程。
青蛙跳台阶
不同路径的数目
兑换零钱
最长回文子串
最长上升子序列
矩阵的最小路径和
背包问题
编辑距离
回溯
我们经常会遇到需要在递归调用的上下文之间传递状态的问题,对于简单的情况,我们可以通过递归函数的传参来传递这种状态,但复杂情况下,我们就需要在递归函数中用额外代码维持那个状态了,我们把这种方式称为回溯。
没有重复项数字的全排列
岛屿数量
N皇后问题
二叉树中和为某一值的路径(二)
图论算法
对于链表和树这种数据结构,我们更关心对象的存储和查询,但对于图这种数据结构,我们更关心节点之间的拓扑关系,我们应熟悉在图中找最短路径、最小生成树的算法
最短路径
最小生成树
其他算法
除了上述解决编程问题的常见思路之外,面试中遇到新题,还有一些其他的考虑问题的角度,包括贪心、数学方法、模拟方法、位运算、前缀和等,此处给出常见问题。
分糖果问题
约瑟夫环
数组中只出现一次的两个数字
设计LRU缓存结构
哈夫曼树
综合篇
刷完上面的题目之后,同学们基本也有了一定的代码基础和算法思路,那么接下来,就可以综合刷题,可以刷下面这里的算法,这里同学们可以先刷简单的,再刷中等的
简单28道
有效的括号 | 对称二叉树 | 统计一个数字在数组中出现的次数 | 排序数组中两个数字之和 | 查找插入位置 | 左右两边子数组的和相等 | 将有序列表转换为二叉搜索树 |
设计哈希映射 | 找到小镇法官 | 判断字符是否唯一 | 返回倒数第K个节点 | 栈的最小值 | 三合一 | BiNode |
快乐数 | 有效字母异味 | 删除重复的电子邮箱 | 各位相加 | 左子树之和 | 验证外星语词典 | 数组拆分 |
最长和谐子序列 | 删列造序 | 删除最外层括号 | 整数的各位积和之差 | 括号的最大嵌套深度 | 反转字符串 | 机器人能否返回原点 |
中等(21道)
链表求和 | 栈排序 | 括号 | 旋转矩阵 | 特定深度节点链表 | 递归乘法 | 二叉树层序遍历 |
最小栈 | 完全平方数 | 不同的二插搜索树 | 打家劫舍 | 最长递增子序列 | 为运算表达式设计优先级 | 两个字符串的删除操作 |
颜色分类 | 最长特殊序列 | 电话号码字母组合 | 矩阵置零 | 第K个最小素数分数 | 最大平均值和的分组 | 子集 |