面试需要的基础知识
设计模式
数学知识
数据结构
算法
编程语言
主抓Python和JAVA
数据结构
大多数面试题都是围绕数组、字符串、链表、树、栈、队列等几种常见的数据结构展开的。
数组
数组占据一块连续的内存并按照顺序存储数据。
由于数组的内存是连续的,读写的时间复杂度是O(1),所以效率高。
数组小预先分配内存,因此空间效率不是很好,经常出现没有充分利用的空闲区域。
动态数组:先开辟较小的空间,当数据量超过数组的容量时,重新分配一个大的空间,并把之前的数据复制到新的数组中,再把之前的内存释放。
二维数组
字符串
- 字符串通常存在数组中,因此有些操作类似于数组。
链表
链表用指针把若干个结点连接成链状结构。
基本操作有:创建结点、插入结点、删除结点、查找结点、遍历结点。
链表变体有:单向循环链表、双向链表、双向循环链表、复杂链表(结点除了指向下一结点外还指向一个任意结点)。
常见操作有:反向打印链表、反转链表、合并已排序链表、O(1)删除链表
树
父结点和子结点用指针链接,常用的是二叉树。
二叉树的遍历有递归和循环两种实现方式:(说的是根的顺序)前序遍历、中序遍历、后序遍历、宽度优先遍历、深度预先遍历
二叉搜索树:左子结点小于等于根节点,右子结点大于等于根节点,查找结点的时间复杂度是O(log(n))。
堆:有最大堆和最小堆。
红黑树
平衡树
B/B+树
索引树
栈和队列
栈:后进先出,出栈和入栈
队列:先进先出,出队列和入队列
用两个栈实现队列
用两个队列实现栈
算法和数据操作
排序和查找是面试时考查算法的重点,应该重点掌握二分查找、归并排序和快速排序,能做到能随时正确、完整地写出代码。
有很多算法可以用递归和循环两种不同的方式实现。通常基于递归的实现方法会比较简洁,但性能不如基于循环的实现方式。
位运算可以看成特殊的算法,它把数字表示成二进制之后对0和1的操作,只有五中位运算:与、或、异或、左移和右移。
查找和排序
查找的类型有:顺序查找、二分查找、哈希查找和二叉排序树查找。
排序的类型有:插入排序、冒泡排序、归并排序、快速排序、堆排序。
比较不同排序的优劣:额外空间、平均时间复杂度、最坏平均复杂度、是否是稳定排序等。
递归和循环
递归是在一个函数的内部调用这个函数本身。但是递归的很多计算都是重复的,如何解决重复计算的问题是优化的一个思路。还可能引起调用栈溢出。
循环是通过设置计算的初始值及终止条件,在一个范围内重复运算。
斐波那契数列问题,以及类似问题,如青蛙跳台阶问题、2x1矩形覆盖2xn矩形问题。
位运算
只有五中位运算:与、或、异或、左移和右移。
移位的时候注意补0还是补1。
n&(n-1)相当于把n的二进制的最后面的1变成0。