面试需要的基础知识

  • 设计模式

  • 数学知识

  • 数据结构

  • 算法

编程语言

主抓Python和JAVA

数据结构

大多数面试题都是围绕数组、字符串、链表、树、栈、队列等几种常见的数据结构展开的。

数组
  • 数组占据一块连续的内存并按照顺序存储数据。

  • 由于数组的内存是连续的,读写的时间复杂度是O(1),所以效率高。

  • 数组小预先分配内存,因此空间效率不是很好,经常出现没有充分利用的空闲区域。

  • 动态数组:先开辟较小的空间,当数据量超过数组的容量时,重新分配一个大的空间,并把之前的数据复制到新的数组中,再把之前的内存释放。

  • 二维数组

字符串

  • 字符串通常存在数组中,因此有些操作类似于数组。

链表

  • 链表用指针把若干个结点连接成链状结构。

  • 基本操作有:创建结点、插入结点、删除结点、查找结点、遍历结点。

  • 链表变体有:单向循环链表、双向链表、双向循环链表、复杂链表(结点除了指向下一结点外还指向一个任意结点)。

  • 常见操作有:反向打印链表、反转链表、合并已排序链表、O(1)删除链表

  • 父结点和子结点用指针链接,常用的是二叉树。

  • 二叉树的遍历有递归和循环两种实现方式:(说的是根的顺序)前序遍历、中序遍历、后序遍历、宽度优先遍历、深度预先遍历

  • 二叉搜索树:左子结点小于等于根节点,右子结点大于等于根节点,查找结点的时间复杂度是O(log(n))。

  • 堆:有最大堆和最小堆。

  • 红黑树

  • 平衡树

  • B/B+树

  • 索引树

栈和队列

  • 栈:后进先出,出栈和入栈

  • 队列:先进先出,出队列和入队列

  • 用两个栈实现队列

  • 用两个队列实现栈

算法和数据操作

排序和查找是面试时考查算法的重点,应该重点掌握二分查找、归并排序和快速排序,能做到能随时正确、完整地写出代码。

有很多算法可以用递归和循环两种不同的方式实现。通常基于递归的实现方法会比较简洁,但性能不如基于循环的实现方式。

位运算可以看成特殊的算法,它把数字表示成二进制之后对0和1的操作,只有五中位运算:与、或、异或、左移和右移。

查找和排序

  • 查找的类型有:顺序查找、二分查找、哈希查找和二叉排序树查找。

  • 排序的类型有:插入排序、冒泡排序、归并排序、快速排序、堆排序。

  • 比较不同排序的优劣:额外空间、平均时间复杂度、最坏平均复杂度、是否是稳定排序等。

递归和循环

  • 递归是在一个函数的内部调用这个函数本身。但是递归的很多计算都是重复的,如何解决重复计算的问题是优化的一个思路。还可能引起调用栈溢出。

  • 循环是通过设置计算的初始值及终止条件,在一个范围内重复运算。

  • 斐波那契数列问题,以及类似问题,如青蛙跳台阶问题、2x1矩形覆盖2xn矩形问题。

位运算

  • 只有五中位运算:与、或、异或、左移和右移。

  • 移位的时候注意补0还是补1。

  • n&(n-1)相当于把n的二进制的最后面的1变成0。