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

程序员如何快速准备面试中的算法 备战面试中算法的五个步骤

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

1、掌握一门编程语言

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

C的话,推荐Dennis M. Ritchie & Brian W. Kernighan合著的《C程序设计语言》,和《C和指针》;

C++ 则推荐《C++ Primer》,《深度探索C++对象模型》 、《Effective C++》 。 掌握一门语言并不容易,不是翻完一两本书即可了事,语言的细枝末节需要在平日不断的编程练习中加以熟练。

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

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

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

3、苦补数据结构基础

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

4、看算法导论

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

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

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

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

而不论是准备国内还是国外的海量数据处理面试题,此文必看:教你如何迅速秒杀掉:99%的海量数据处理面试题。此外,多看看优秀的开源代码,如nginx或redis,多做几个项目加以实践之,尽早实习(在一线互联网公司实习3个月可能胜过你自个黑灯瞎火摸爬滚打一年)。

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

学习最忌心浮气躁,急功近利,即便练习了算法,也不一定代表能万无一失

通过笔试面试关,因为总体说来,在一般的笔试面试中,70%基础+ 30%coding能力(含算法),故如果做到了上文中的5个步骤,还远远不够。最后,我推荐一份非算法的书单,以此为大家查漏补缺(不必全部看完,欢迎大家补充): 《深入理解计算机系统》

W.Richard Stevens著的《TCP/IP详解三卷》,《UNIX网络编程二卷》,《UNIX环境高级编程:第2版》

你如果要面机器学习一类的岗位,建议看看相关的算法(如支持向量机通俗导论(理解SVM的三层境界)),及老老实实补补数学基础,包括微积分、线性代数、概率论与数理统计(除了教材,推荐一本《数理统计学简史》)、矩阵论(推荐《矩阵分析与应用》)等

综上:上述全部过程短则半年,长则三年。

最后要强调的是:急功近利者必败,越想快速越要循序渐进,踏实前进,若实在觉得算法、编程太难,转产品、运营、测试、运维、前端、设计都是不错的选择,因为虽然编程有趣,但不一定人人适合编程。

 

第二篇:如何面试程序员

如何面试程序员

你要面试一个程序员,应该问他什么问题?

有人在的讨论区里,请求指点,怎么才能在面试中发现合格的人。众人纷纷出主意,有很多高质量的回帖,我觉得挺有启发,就整理出了下面这篇文章。

===================================

如何面试程序员?

阮一峰 整理

一、提问之前的准备

首先,最重要的是,你自己一开始就应该想清楚:

1. 需要新员工完成什么样的任务?

2. 怎样的人能完成这样的任务?

3. 哪些途径和方法可以发现这样的人?

只有明确这些根本性的问题,才能正确高效地完成面试。

二、提问的原则

假定你对上一节的三个问题,已经有了清晰的想法,那么接下来就可以设计如何提问了。

有一些提问的原则,是你应该遵循的:

* 每一个面试问题都有明确的目的。你不仅自己了解,还能向其他面试官解释清楚。

* 多提一些开放性(Open-ended)的问题,而不是那种用Yes/No就可以回答的问题。这样做使你有机会与面试者展开讨论,并且提出后续的问题,尽可能多地了解对方。

* 不要问宗教、家庭、健康、个人隐私等方面的问题。

* 不要问太复杂的问题。因为面试者没有太多思考时间,所以无法周全地回答,你也就无从判断他的能力了。

三、考察专业能力

为了确认面试者是胜任的,你可以问一些与职位相关的专业方面的问题。(不过通常来说,一次面试不足以看出一个人的专业能力。)

比如,你的招聘职位是系统管理员,你可以问"如何快速地在50台机器上部署Linux?"(提示:正确答案不是刻录50张安装光盘。)

另外,你还应该向面试者了解他的过去,因为过去是未来的最好预测依据。不过,提问的重点不要仅仅是他过去的成果,更要关注在当时的环境中,他是如何决策和实施的。

四、考察综合素质

因为人是会发展的,所以某种程度上,面试者的综合素质要比他的专业能力更重要。

所以,具体的技术问题(如何调用API、什么是设计模式、编程语言的语法等等)可以少问一些,更应该关注面试者的事业心、对工作的热情、进取心、自律能力、毅力等方面。

下面是一些典型问题:

Why did you get into development?

你为什么开发软件?

How many technical books did you read in the past year?

去年你读了几本技术书籍?

What was your favorite technical book in the past year? What did you learn from it?

去年你最喜欢的技术书籍是哪本?你从中学到了什么?

What websites do you read regularly, related to development?

平时你经常访问哪些编程类网站?

Do you maintain any open-source projects?

你有自己的开源项目吗?

Do you code in your spare-time?

业余时间你编程吗?

Do you love programming, or do you do it for the money?

对于你来说,编程是一种爱好,还是一种谋生手段?

Have you accomplished anything important in your career yet? Do you want to?

你的职业生涯之中有什么重要的成就?它是你主导的吗?

What would make you feel that you have done something important? 什么事情会让你很有成就感?

五、考察理性思维

某些情况下,你可能需要了解面试者的分析判断能力,看他能否全面地思考问题、客观地评价自己。

那么,你可以依次提出这样三个问题:

What's your favorite programming language? Why?

你最喜欢的编程语言是哪种?为什么?

If you could add one feature to your favorite language, what would it be? Why?

如果允许你为这种语言加一种功能,你会加什么功能?为什么?

If you could remove one feature from it, what would it be? Why?

如果允许你取消一种功能,会是什么功能?为什么?

这里的重点是,让面试者从正反两方面评价一件自己熟悉的东西,看看他的思维是否片面。答案无所谓对错,只要面试者有一个明确的立场,能够从正反两方面说出令人信服的理由,就可以了。比如,某个软件的口碑不好,但是面试者说他

很喜欢,而且说得出一大堆理由,清楚地解释了这种软件的优点和缺点在哪里,这样就很好。

你还可以把这些问题,套用在其他东西上面,比如操作系统、文字编辑器等等。 (完)

相关推荐