- 数据结构和算法
- 语言基础
- 编程能力
- 数学知识
- 问题分析和推理能力
- 常见的设计模式,UML图等
- 线性结构
- 数组
- 字符串
- 链表
- 栈(递归)
- 队列(广度优先搜索算法)
- 非线性结构
- 树
- 图
总结:
-
数组的内存是连续的,可以根据下标在O(1)时间内读写任何元素。 我们可以根据数据时间效率高的特点,用数组实现简单的哈希表; 把数组的下标设置为哈希表的键值(Key),把数组中的每一个数字设置为哈希表的值(Value), 这样每一个下标以及数组中该下标对应的数字就组成一个Key-Value的配对。(For ex: 可以为ASII码设置一个长度为256的数组,实现哈希)。
-
数组处理。如果处理后的长度已知,可以考虑从数组末尾开始处理。这样可以避免数组中插入删除低效率的问题。或者使用辅助空间。
-
链表。查找效率为O(n)。对于链表问题的处理: 递归,使用栈(逆序输入链表)。双指针链表,以不同的速度运行。
-
树。二叉树,二叉搜索树,堆(最小堆和最大堆),红黑树。前序遍历,中序遍历,后序遍历(递归与循环实现)。通常使用栈或者队列做操作辅助。
-
栈和队列。
-
排序和搜索算法。有很多算法都可以使用递归和循环两种不同的方式实现,通常基于递归的实现方法会比较简洁,但性能不如基于循环的。 改进的方法并不复杂,只需要想办法避免重复就行了,比如我们可以把已经得到的数组中间项保存下来,如果下次需要计算的时候先查找一下就行了。 查找分为:顺序查找。二分查找,哈希表查找和二叉排序树查找。当数组是已经排序的或者部分排序的,优先考虑二分查找。 哈希表查找的优点在于它能够在O(1)时间查找某一元素,是效率最高的查找,但是需要额外空间实现哈希表。 排序:插入排序,冒泡排序,归并排序,快速排序等。Partition算法除了在快速排序中,还可以在无序数组中寻找第K大值。
动态规划 = 子状态 + 状态转移方程 N->N-1问题