剑指offer-面试需要的基本知识
编程语言
单例模式
java版好的解法
- 懒汉模式,field直接创建实例
- volatile+双重检查,加volatile是防止其他线程在本线程刚分配内存、还未初始化时就得到instance
- 静态内部类,内部类中在filed创建实例,实现在使用时才创建
数据结构
数组
- 找出数组中重复的数字。
- 最简单的是哈希表,时间O(1),空间O(n).
- 如果空间优先,允许修改原数组。遍历数组的过程中,判断值m与下标m的位置的值是否相同,相同,找到;不相同,替换值m与下标m位置的值。时间O(n),时间O(1).
- 空间优先,不允许修改原数组。利用二分查找的思想。将数组与n的中值比较,判断出重复的数是小于还是大于中值,继续二分中值。
- 二维数组中的查找,行从左到右升序,列从上到下升序,判断是否存在给定的数。clue:从右上或左下开始判断。
字符串
注意某些情形下,从后往前处理,可以减少移动的次数。
链表
链表创建、插入、删除。
树
- 遍历
- (根节点所在位置)前序,中序,后序
- 宽度优先:利用队列,存储当前深度的节点
- 重建二叉树
- 二叉树的下一个节点
栈和队列
- 相互实现
算法和数据操作
递归和循环
递归的实现方式代码简洁,但性能不如循环的实现方式
查找和排序
重点掌握二分查找、归并排序和快速排序
回溯法
在二维数组上搜索路径
动态规划与贪婪算法
动态规划:求某个问题的最优解,且问题可以分为多个子问题。(自上而下:递归,自下而上:循环)
贪婪算法:存在特殊的选择,一定能得到最优解。
位运算
与、或、异或、左移、右移。