由于要找工作,最近刷了点题,看了点书,做了些校招笔试,总结一些算法笔试的要点吧。
1. 题目
笔试的时候,第一步还是要认真读题,这个没什么好说的,题都不懂是做不下去的。
2. 解题思路
在读完题目的时候,不要急着动手写代码。
这一步要做的是理清思路,可以借助画图等工具。
这一步的最终目标是得到算法流程图。
3. 输入输出
笔试的时候通常会有两种类型,
一种是不需要输入输出,直接在函数参数中给出要处理的数据,然后通过返回值返回。
另外一种是需要输入输出,需要输入输出的又分为两种:
1. 通过终端输入输出
2. 通过文件输入输出
4. 数据结构
算法笔试的时候通常要借助于一些常用的数据结构,比如:数组/字符串/链表/树/栈/队列/哈希表/集合等。
数组和字符串是两种最基本的数据结构,它们分别用连续内存存储数字和字符。
链表和树需要大量的指针操作,因此对指针操作要特别熟悉。
栈是一个和递归紧密相关的数据结构。
队列于广度有限遍历算法相关。
5. 算法
5.1 递归与循环
掌握递归的思想与执行流程,以及递归与循环之间的相互转换。
常见的题目包括:1~n求和,汉诺塔问题,斐波那契级数列。
5.2 查找
查找无非就是顺序查找,二分查找,哈希表查找,二叉树查找。
其中顺序查找,二分查找都是按照一定的规则在原有的数据上进行查找,
哈希表查找/二叉树查找是要构造一个特殊的数据结构,因此需要额外的存储空间。
5.3 排序
排序是算法中最基本的一个问题,因此各种算法也比较成熟,
需要对各种算法的思想/实现/复杂度/优化/稳定性烂熟于心。
常见的排序算法包括:冒泡排序/选择排序/插入排序/归并排序/快速排序/堆排序/希尔排序等,其中插入排序、归并排序、快排、堆排较为常用,要重点掌握。
5.4 贪心
5.5 分治
将现有问题划分成若干不相关的子问题,分别求解。
5.6 动态规划
将现有问题划分成若干相关的子问题,
寻找子问题的最优子结构,寻找递归式。
采用自顶向下分析,自底向上的解法。
因为在子问题求解中,通常会有大量重复的计算,因此需要一个额外的容器去存储已经计算的值,比如hashmap,这样就会减少一些重复计算。
常见的题目包括:
1维:青蛙跳台阶,钢条切割问题
2维:最长公共子序列,最短编辑距离
5.7 回溯法
5.8 位运算
6. 测试用例
功能性测试:是否能达到题目的要求。
特殊输入测试:比如空指针,输入的是字符串而不是数字等。
7. 提高代码质量
8. 编码风格
参考谷歌代码风格