Skip to content

Latest commit

 

History

History
78 lines (47 loc) · 7.67 KB

File metadata and controls

78 lines (47 loc) · 7.67 KB

程序员如何准备面试中的算法

面试中常考哪些算法

既然要备战面试中的算法,那么首要前提当然是得知道需要准备哪些算法,即凡事得先知道what,然后再考虑how。

一般来说,笔试面试中常考的知识点有:

  • 数据结构:字符串、链表、数组、堆、哈希表、树(Trie树、后缀树、红黑树、B树、R树)、图(遍历:BFS、DFS、Dijkstra);
  • 算法:基于各个数据结构的查找(二分、二叉树)、排序、遍历,分治、递归、回溯,贪心算法、动态规划、海量数据,外加字符串匹配和资源调优;
  • 数学:排列组合概率;
  • 操作系统、网络协议、数据库等等。

学习一个算法,先知其解决什么,后知其解决策略,最后了解彼此之间的联系。如图算法中,①广搜:一层一层往外遍历,寻找最短路径,策略:队列,②最小生成树:最小代价连接所有点,策略:贪心(Prim:贪心+权重队列),③Dijkstra:寻找单源最短路径,策略:贪心+非负权重队列,④Floyd:多结点对的最短路径,策略:动态规划。

而贪心和动态规划之间的联系是,贪心:最优子结构+局部最优,动态规划:最优独立重叠子结构+全局最优,数组+链表=Hash表。此外,你还可以放空自己,不知道任何算法,去尝试解决一个个问题,后发现,原来解决某某问题的方法就是某某算法。

知道了what、和how,最后就是按部就班一步一个脚印学习之:to do。

备战面试中算法的五个步骤

那么,对于立志进一线互联网公司,同时不满足于一辈子干纯业务应用开发,希望在后端做点事情的同学来说,备战面试中的算法,分为哪几个步骤呢?如下:

1、掌握一门编程语言

首先你得确保你已掌握好一门编程语言:

  • C的话,推荐Dennis M. Ritchie & Brian W. Kernighan合著的《C程序设计语言》,和《C和指针》;
  • C++ 则推荐《C++ Primer》,《深度探索C++对象模型》,《Effective C++》;
  • Java推荐《Thinking in Java》,《Core Java》,《Effictive Java》,《深入理解Java虚拟机》。

掌握一门语言并不容易,不是翻完一两本书即可了事,语言的细枝末节需要在平日不断的编程练习中加以熟练。

2、过一遍微软面试100题系列

我从2010年起开始整理微软面试100题系列,见过的题目不可谓不多,但不管题目怎般变化,依然是那些常见的题型和考察点,当然,不考察任何知识点,纯粹考察编程能力的题目也屡见不鲜。故不管千变万化,始终不离两点:①看你基本知识点的掌握情况;②编程基本功。

而当你看了一遍微软面试100题之后(不要求做完),你自会意识到:数据结构和算法在笔试面试中的重要性。

例如你会发现解决面试编程题几种常用思路,就是活用数据结构+算法:

  • 分治,分而治之,然后归并;
  • 空间换时间,如活用hashtable;
  • 巧用数据结构,如堆代替数组;
  • 能排序,考虑排序,比如前后两个指针往中间扫,若已经排好序,想想有无必要二分;
  • 不能排序,考虑动态规划,如 01背包问题,每一步都在决策;
  • 细节处理,注意边界条件。

3、苦补数据结构基础

如果学数据结构,可以看我们在大学里学的任一本数据结构教材都行,如果你觉得实在不够上档次,那么可以再看看《STL源码剖析》。

然后,你会发现:大部分的面试题都在围绕一个点:基于各种数据结构上的增删改查。如字符串的查找翻转,链表的查找遍历合并删除,树和图的查找遍历,后来为了更好的查找,我们想到了排序,排序仍然不够,我们有了贪心、动态规划,再后来东西多了,于是有了海量数据处理,资源有限导致人们彼此竞争,出现了博弈组合概率。

4、看算法导论

《算法导论》上的前大部分的章节都在阐述一些经典常用的数据结构和典型算法(如二分查找快速排序Hash表),以及一些高级数据结构(诸如红黑树B树),如果你已经学完了一本数据结构教材,那么建议你着重看贪心、动态规划、图论等内容,这3个议题每一个议题都大有题目可出。同时,熟悉常用算法的时间复杂度

如果算法导论看不懂,你可以参看本博客。

5、刷leetcode或cc150或编程艺术系列

  • 如主要在国外找工作,推荐两个面试编程网站:一个是http://leetcode.com/ ,leetcode是国外一网站,它上面有不少编程题;另外一个是http://www.careercup.com/ ,而后这个网站的创始人写了本书,叫《careercup cracking coding interview》,最终这本英文书被图灵教育翻译出版为《程序员面试金典》。

  • 若如果是国内找工作,则郑重推荐我编写的《程序员编程艺术》,有编程艺术博客版,以及在博客版本基础上精简优化的编程艺术github版。除此之外,还可看看《编程之美》,与《剑指offer》。

而不论是准备国内还是国外的海量数据处理面试题,此文必看:教你如何迅速秒杀掉:99%的海量数据处理面试题

此外,多看看优秀的开源代码,如nginxredis,多做几个项目加以实践之,尽早实习(在一线互联网公司实习3个月可能胜过你自个黑灯瞎火摸爬滚打一年)。

当然,如果你是准备社招,且已经具备了上文所说的语言 & 数据结构 & 算法基础,可以直接跳到本第五步骤,开始刷leetcode或cc150或编程艺术系列。

后记

学习最忌心浮气躁,急功近利,即便练习了算法,也不一定代表能万无一失通过笔试面试关,因为总体说来,在一般的笔试面试中,70%基础+ 30%coding能力(含算法),故如果做到了上文中的5个步骤,还远远不够,最后,我推荐一份非算法的书单,以此为大家查漏补缺(不必全部看完,欢迎大家补充):

  1. 《深入理解计算机系统》
  2. W.Richard Stevens著的《TCP/IP详解三卷》,《UNIX网络编程二卷》,《UNIX环境高级编程:第2版》,详见此豆瓣页面
  3. 你如果要面机器学习一类的岗位,建议看看相关的算法(如支持向量机通俗导论(理解SVM的三层境界)),及老老实实补补数学基础,包括微积分、线性代数、概率论与数理统计*(除了教材,推荐一本《数理统计学简史》)、矩阵论(推荐《矩阵分析与应用》)*等..

最后望大家循序渐进,踏实前进,若实在觉得算法 & 编程太难,转产品、运营、测试、运维、前端、设计都是不错的选择,因为虽然编程有趣,但不一定人人适合编程。