经典面试算法常识题

2022-03-23 综合 86阅读 投稿:北忆

1.16个经典面试问题

16个经典面试问题回答思路 面试过程中,面试官会向应聘者发问,而应聘者的回答将成为面试官考虑是否接受他的重要依据。

对应聘者而言,了解这些问题背后的“猫腻”至关重要。本文对面试中经常出现的一些典型问题进行了整理,并给出相应的回答思路和参考答案。

读者无需过分关注分析的细节,关键是要从这些分析中“悟”出面试的规律及回答问题的思维方式,达到“活学活用”。 问题一:“请你自我介绍一下” 思路: 1、这是面试的必考题目。

2、介绍内容要与个人简历相一致。 3、表述方式上尽量口语化。

4、要切中要害,不谈无关、无用的内容。 5、条理要清晰,层次要分明。

6、事先最好以文字的形式写好背熟。 问题二:“谈谈你的家庭情况” 思路:1、况对于了解应聘者的性格、观念、心态等有一定的作用,这是招聘单位问该问题的主要原因。

2、简单地罗列家庭人。 3、宜强调温馨和睦的家庭氛围。

4、宜强调父母对自己教育的重视。 5、宜强调各位家庭成员的良好状况。

6、宜强调家庭成员对自己工作的支持。 7、宜强调自己对家庭的责任感。

问题三:“你有什么业余爱好?” 思路: 1、业余爱好能在一定程度上反映应聘者的性格、观念、心态,这是招聘单位问该问题的主要原因。 2、最好不要说自己没有业余爱好。

3、不要说自己有那些庸俗的、令人感觉不好的爱好。 4、最好不要说自己仅限于读书、听音乐、上网,否则可能令面试官怀疑应聘者性格孤僻。

5、最好能有一些户外的业余爱好来“点缀”你的形象。 问题四:“你最崇拜谁?” 思路: 1、最崇拜的人能在一定程度上反映应聘者的性格、观念、心态,这是面试官问该问题的主要原因。

2、不宜说自己谁都不崇拜。 3、不宜说崇拜自己。

4、不宜说崇拜一个虚幻的、或是不知名的人。 5、不宜说崇拜一个明显具有负面形象的人。

6、所崇拜的人人最好与自己所应聘的工作能“搭”上关系。 7、最好说出自己所崇拜的人的哪些品质、哪些思想感染着自己、鼓舞着自己。

问题五:“你的座右铭是什么?” 思路: 1、座右铭能在一定程度上反映应聘者的性格、观念、心态,这是面试官问这个问题的主要原因。 2、不宜说那些医引起不好联想的座右铭。

3、不宜说那些太抽象的座右铭。 4、不宜说太长的座右铭。

5、座右铭最好能反映出自己某种优秀品质。 6、参考答案--“只为成功找方法,不为失败找借口” 问题六:“谈谈你的缺点” 思路: 1、不宜说自己没缺点。

2、不宜把那些明显的优点说成缺点。 3、不宜说出严重影响所应聘工作的缺点。

4、不宜说出令人不放心、不舒服的缺点。 5、可以说出一些对于所应聘工作“无关紧要”的缺点,甚至是一些表面上看是缺点,从工作的角度看却是优点的缺点。

问题七:“谈一谈你的一次失败经历” 思路: 1、不宜说自己没有失败的经历。 2、不宜把那些明显的成功说成是失败。

3、不宜说出严重影响所应聘工作的失败经历, 4、所谈经历的结果应是失败的。 5、宜说明失败之前自己曾信心白倍、尽心尽力。

6、说明仅仅是由于外在客观原因导致失败。 7、失败后自己很快振作起来,以更加饱满的热情面对以后的工作。

问题八:“你为什么选择我们公司?” 思路: 1、面试官试图从中了解你求职的动机、愿望以及对此项工作的态度。 2、建议从行业、企业和岗位这三个角度来回答。

3、参考答案--“我十分看好贵公司所在的行业,我认为贵公司十分重视人才,而且这项工作很适合我,相信自己一定能做好。” 问题九:“对这项工作,你有哪些可预见的困难?” 思路: 1、不宜直接说出具体的困难,否则可能令对方怀疑应聘者不行。

2、可以尝试迂回战术,说出应聘者对困难所持有的态度--“工作中出现一些困难是正常的,也是难免的,但是只要有坚忍不拔的毅力、良好的合作精神以及事前周密而充分的准备,任何困难都是可以克服的。” 问题十:“如果我录用你,你将怎样开展工作” 思路: 1、如果应聘者对于应聘的职位缺乏足够的了解,最好不要直接说出自己开展工作的具体办法, 2、可以尝试采用迂回战术来回答,如“首先听取领导的指示和要求,然后就有关情况进行了解和熟悉,接下来制定一份近期的工作计划并报领导批准,最后根据计划开展工作。”

问题十一:“与上级意见不一是,你将怎么办?” 思路: 1、一般可以这样回答“我会给上级以必要的解释和提醒,在这种情况下,我会服从上级的意见。” 2、如果面试你的是总经理,而你所应聘的职位另有一位经理,且这位经理当时不在场,可以这样回答:“对于非原则性问题,我会服从上级的意见,对于涉及公司利益的重大问题,我希望能向更高层领导反映。”

问题十二:“我们为什么要录用你?” 思路: 1、应聘者最好站在招聘单位的角度来回答。 2、招聘单位一般会录用这样的应聘者:基本符合条件、对这份共组感兴趣、有足够的信心。

3、如“我符合贵公司的招聘条件,凭我目前掌握的技能、高度的责任感和良好的饿适应能力及学习能力 ,完全能胜任这份工作。我十分希望能为贵 公司服务,如果贵公司给我这个机会,我一定能成为贵。

2.一些面试常见问题的经典回答

我是大四的学生,前两个月也在忙着找工作,现在已经找到满意的工作了。

下面是一些我在求职的过程中搜集和整理出来的资料,关于面试时比较有可能提到的问题及答题的思路,比较实用的,希望能帮到你。有点长,耐心看看,会用的上的:)祝你成功!—— 问题一:“请你自我介绍一下” 思路: 1、这是面试的必考题目。

2、介绍内容要与个人简历相一致。 3、表述方式上尽量口语化。

4、要切中要害,不谈无关、无用的内容。 5、条理要清晰,层次要分明。

6、事先最好以文字的形式写好背熟。 问题二:“谈谈你的家庭情况” 思路: 1、况对于了解应聘者的性格、观念、心态等有一定的作用,这是招聘单位问该问题的主要原因。

2、简单地罗列家庭人口。 3、宜强调温馨和睦的家庭氛围。

4、宜强调父母对自己教育的重视。 5、宜强调各位家庭成员的良好状况。

6、宜强调家庭成员对自己工作的支持。 7、宜强调自己对家庭的责任感。

问题三:“你有什么业余爱好?” 思路: 1、业余爱好能在一定程度上反映应聘者的性格、观念、心态,这是招聘单位问该问题的主要原因。 2、最好不要说自己没有业余爱好。

3、不要说自己有那些庸俗的、令人感觉不好的爱好。 4、最好不要说自己仅限于读书、听音乐、上网,否则可能令面试官怀疑应聘者性格孤僻。

5、最好能有一些户外的业余爱好来“点缀”你的形象。 问题四:“你最崇拜谁?” 思路: 1、最崇拜的人能在一定程度上反映应聘者的性格、观念、心态,这是面试官问该问题的主要原因。

2、不宜说自己谁都不崇拜。 3、不宜说崇拜自己。

4、不宜说崇拜一个虚幻的、或是不知名的人。 5、不宜说崇拜一个明显具有负面形象的人。

6、所崇拜的人人最好与自己所应聘的工作能“搭”上关系。 7、最好说出自己所崇拜的人的哪些品质、哪些思想感染着自己、鼓舞着自己。

问题五:“你的座右铭是什么?” 思路: 1、座右铭能在一定程度上反映应聘者的性格、观念、心态,这是面试官问这个问题的主要原因。 2、不宜说那些医引起不好联想的座右铭。

3、不宜说那些太抽象的座右铭。 4、不宜说太长的座右铭。

5、座右铭最好能反映出自己某种优秀品质。 6、参考答案——“只为成功找方法,不为失败找借口” 问题六:“谈谈你的缺点” 思路: 1、不宜说自己没缺点。

2、不宜把那些明显的优点说成缺点。 3、不宜说出严重影响所应聘工作的缺点。

4、不宜说出令人不放心、不舒服的缺点。 5、可以说出一些对于所应聘工作“无关紧要”的缺点,甚至是一些表面上看是缺点,从工作的角度看却是优点的缺点。

问题七:“谈一谈你的一次失败经历” 思路: 1、不宜说自己没有失败的经历。 2、不宜把那些明显的成功说成是失败。

3、不宜说出严重影响所应聘工作的失败经历, 4、所谈经历的结果应是失败的。 5、宜说明失败之前自己曾信心白倍、尽心尽力。

6、说明仅仅是由于外在客观原因导致失败。 7、失败后自己很快振作起来,以更加饱满的热情面对以后的工作。

问题八:“你为什么选择我们公司?” 思路: 1、面试官试图从中了解你求职的动机、愿望以及对此项工作的态度。 2、建议从行业、企业和岗位这三个角度来回答。

3、参考答案——“我十分看好贵公司所在的行业,我认为贵公司十分重视人才,而且这项工作很适合我,相信自己一定能做好。” 问题九:“对这项工作,你有哪些可预见的困难?” 思路: 1、不宜直接说出具体的困难,否则可能令对方怀疑应聘者不行。

2、可以尝试迂回战术,说出应聘者对困难所持有的态度——“工作中出现一些困难是正常的,也是难免的,但是只要有坚忍不拔的毅力、良好的合作精神以及事前周密而充分的准备,任何困难都是可以克服的。” 问题十:“如果我录用你,你将怎样开展工作” 思路: 1、如果应聘者对于应聘的职位缺乏足够的了解,最好不要直接说出自己开展工作的具体办法, 2、可以尝试采用迂回战术来回答,如“首先听取领导的指示和要求,然后就有关情况进行了解和熟悉,接下来制定一份近期的工作计划并报领导批准,最后根据计划开展工作。”

问题十一:“与上级意见不一是,你将怎么办?” 思路: 1、一般可以这样回答“我会给上级以必要的解释和提醒,在这种情况下,我会服从上级的意见。” 2、如果面试你的是总经理,而你所应聘的职位另有一位经理,且这位经理当时不在场,可以这样回答:“对于非原则性问题,我会服从上级的意见,对于涉及公司利益的重大问题,我希望能向更高层领导反映。”

问题十二:“我们为什么要录用你?” 思路: 1、应聘者最好站在招聘单位的角度来回答。 2、招聘单位一般会录用这样的应聘者:基本符合条件、对这份共组感兴趣、有足够的信心。

3、如“我符合贵公司的招聘条件,凭我目前掌握的技能、高度的责任感和良好的饿适应能力及学习能力 ,完全能胜任这份工作。我十分希望能为贵公司服务,如果贵公司给我这个机会,我一定能成为贵公司的栋梁!” 问题十三:“你能为我们做什么?” 思路: 1、基本原则上“投其所好”。

2、回答这个问题前应聘者最好能。

3.求一些面试常见问题的经典回答

1、请介绍一下你自己。

除基本外,包括:最强的技能、最深入研究的知识领域、个性中最积极的部分、做过的最成功的事,要突出积极的个性和做事的能力,说得合情合理外企才会相信。外企很重视一个人的礼貌,求职者要尊重考官,在回答每个问题之后都说一句“谢谢”。

一般都喜欢有礼貌的求职者。 2、在学校你最不喜欢的课程是什么?为什么? 这个问题招聘者最想从求职者口里听到:我可能对个别科目不是特别感兴趣,但是正因为这样,我会花更多的时间去学习这门课程,通过学习对原本不感兴趣的科目也开始有了兴趣,对于本来就有兴趣的科目我自然学习得更认真,所以各门课的成绩较为平衡。

这个问题不希望求职者直接回答“数学”、“体育”之类的具体课程。 3、说说你最大的优缺点? 他们喜欢求职者从自己的优点说起,中间加一些小缺点,最后再把问题转回到优点上,突出优点的部分。

一般都喜欢聪明的求职者。 4.你认为你在学校属于好学生吗? 如果求职者学习成绩好,就会说:“是的,我的成绩很好,所有的成绩都很优异。

当然,判断一个学生是不是好学生有很多标准,在学校期间我认为成绩是重要的,其他方面包括思想道德、实践经验、团队精神、沟通能力也都是很重要的,我在这些方面也做得很好,应该说我是一个全面发展的学生。”如果求职者成绩不尽理想,便会说:“我认为是不是一个好学生的标准是多元化的,我的学习成绩还可以,在其他方面我的表现也很突出,比如我去很多地方实习过,我很喜欢在快节奏和压力下工作,我在学生会组织过**活动,锻炼了我的团队合作精神和组织能力。”

有经验的招聘者一听就会明白,外企喜欢诚实的求职者。 5.说说你的家庭。

因为和睦的家庭关系对一个人的成长有潜移默化的影响。 6.说说你对行业、技术发展趋势的看法? 对所面试的公司预先了解很多,包括公司各个部门,发展情况,在面试回答问题的时候可以提到所了解的情况,欢迎进入企业的人是“知己”,而不是“盲人”。

7.就你申请的这个职位,你认为你还欠缺什么? 一般不直接回答。他们希望看到这样的求职者:继续重复自己的优势,然后说:“对于这个职位和我的能力来说,我相信自己是可以胜任的,只是缺乏经验,这个问题我想我可以进入公司以后以最短的时间来解决,我的学习能力很强,我相信可以很快融入公司的企业文化,进入工作状态。”

8、如果这次你没有被录取怎么办? 我以为,既来之,则安之。即敞开心怀,坦然处之,不以成败论英雄,只要经过自己的奋斗,对得起自己的努力,不必十分在乎最后的结果。

既不因通过而沾沾自喜,也不因失利而丧失信心。应当从中吸取更多的经验教训和其他选手的优点,避免在今后工作中再出现类似的问题。

就这点来说,就是一种收获和胜利。 9.你能给公司带来什么? 求职者应再次重复自己的优势。

10.你还有什么问题吗? 企业的这个问题看上去可有可无,其实很关键,企业不喜欢说“没有问题”的人,因为其很注重员工的个性和创新能力。企业不喜欢求职者问个人福利之类的问题,如果有人这样问:贵公司对新入公司的员工有没有什么培训项目,我可以参加吗?或者说贵公司的晋升机制是什么样的?企业将很欢迎,因为体现出你对学习的热情和对公司的忠诚度以及你的上进心。

11、大学期间你最大的收获或者说你最大的优势是什么? **大学是一个有深厚文化底蕴的地方,在这里有很多优秀的老师,也有很多优秀的学生,我任何时候做任何事情都可以从他们身上学到很多东西。同时在跟他们合作的时候,我发现了怎样把握自己喜欢做的事情,学会了怎样尊重别人,摆正自身的位置。

有时候我真的必须保持一些相对自身的低调。这样大家才可以一起努力去完成同一个目标。

我想这就是我最大的收获所在了。 12、你对薪水的期望值如何? 错:贸然回答。

应届大学生在面试中谈薪酬是个大忌。在一般大公司看来,没有经验的大学生没有资格谈薪水。

况且新人的起薪都一样,你谈了,人家也不会给你加薪,反而会招致反感。即使对方问你对薪水的期望,你也应谨慎应对,或者干脆用“我相信公司会承认我的工作价值”之类的话搪塞过去。

方法:让对方先说一个数字,这既可避免因自己开出没有把握的高价而错失良机,又可避免你开价过低造成遗憾。正确的办法是:在对方谈到一个确定的数字后,你再根据自身的资历及人才市场上的薪金行情进行客观分析,在此基础上进行合理报价。

这样价位出入不会太大,合作的概率也就增加。在确定目标前,不妨先演习几次,它会给你一个心理底数。

13、你认为你适合干什么? 错:只要公司需要,我什么都能干。你什么都能干?那要我干什么?你必须让人觉得你有抱负,但也脚踏实地。

你觉得自己最适合干什么,就老实告诉人家,“服从需要”之类的空话,效果适得其反。 14、你并非毕业于名牌院校? 答:比尔盖茨也未毕业于哈佛大学! 15.你专业怎么与所申请的职位不对口? 答:据说,21世纪最抢手就是复合型人才,而外行的灵感往往超过内行,因为他们没有思维定势、没有条条框框的约束。

16.你学历对我们。

4.老生常谈:面试算法有必要吗

首先,面试什么东西不是被面试者决定的,而是面试者决定的。

其次,编程,本质上是用计算机解决问题,而经过多年业界总结出来的经典算法,就是针对经典而典型问题的解决方案,学习这些算法,除了能够解决这些典型问题之外还能够掌握解决问题的能力,从而触类旁通。所以说,面试算法是考察被面试者解决问题能力的一种方法。

第三,面试内容除了它能否起到考察作用之外,还要考虑成本问题。看一个被面试者能否做出一道算法题,是一个成本很低的做法(甚至连电脑都不需要),这对于公司来说是可以接受的。

综上所述,面试算法有必要。

5.一道经典的面试题:如何从N个数中选出最大(小)的n个数

这个问题我前前后后考虑了有快一年了,也和不少人讨论过。

据我得到的消息,Google和微软都面过这道题。这道题可能很多人都听说过,或者知道答案(所谓的堆),不过我想把我的答案写出来。

我的分析也许存有漏洞,以交流为目的。但这是一个满复杂的问题,蛮有趣的。

看完本文,也许会启发你一些没有想过的解决方案(我一直认为堆也许不是最高效的算法)。在本文中,将会一直以寻找n个最大的数为分析例子,以便统一。

注:本文写得会比较细节一些,以便于绝大多数人都能看懂,别嫌我罗嗦:) 我很不确定多少人有耐心看完本文! Naive 方法: 首先,我们假设n和N都是内存可容纳的,也就是说N个数可以一次load到内存里存放在数组里(如果非要存在链表估计又是另一个challenging的问题了)。从最简单的情况开始,如果n=1,那么没有任何疑惑,必须要进行N-1次的比较才能得到最大的那个数,直接遍历N个数就可以了。

如果n=2呢?当然,可以直接遍历2遍N数组,第一遍得到最大数max1,但是在遍历第二遍求第二大数max2的时候,每次都要判断从N所取的元素的下标不等于max1的下标,这样会大大增加比较次数。对此有一个解决办法,可以以max1为分割点将N数组分成前后两部分,然后分别遍历这两部分得到两个最大数,然后二者取一得到max2。

也可以遍历一遍就解决此问题,首先维护两个元素max1,max2(max1=max2),取到N中的一个数以后,先和max1比,如果比max1大(则肯定比max2大),直接替换max1,否则再和max2比较确定是否替换max2。采用类似的方法,对于n=2,3,4一样可以处理。

这样的算法时间复杂度为O(nN)。当n越来越大的时候(不可能超过N/2,否则可以变成是找N-n个最小的数的对偶问题),这个算法的效率会越来越差。

但是在n比较小的时候(具体多小不好说),这个算法由于简单,不存在递归调用等系统损耗,实际效率应该很不错. 堆:当n较大的时候采用什么算法呢?首先我们分析上面的算法,当从N中取出一个新的数m的时候,它需要依次和max1,max2,max3max n比较,一直找到一个比m小的max x,就用m来替换max x,平均比较次数是n/2。可不可以用更少的比较次数来实现替换呢?最直观的方法是,也就是网上文章比较推崇的堆。

堆有这么一些好处:1.它是一个完全二叉树,树的深度是相同节点的二叉树中最少的,维护效率较高;2.它可以通过数组来实现,而且父节点p与左右子节l,r点的数组下标的关系是s[l] = 2*s[p]+1和s[r] = 2*s[p]+2。在计算机中2*s[p]这样的运算可以用一个左移1位操作来实现,十分高效。

再加上数组可以随机存取,效率也很高。3.堆的Extract操作,也就是将堆顶拿走并重新维护堆的时间复杂度是O(logn),这里n是堆的大小。

具体到我们的问题,如何具体实现呢?首先开辟一个大小为n的数组区A,从N中读入n个数填入到A中,然后将A维护成一个小顶堆(即堆顶A[0]中存放的是A中最小的数)。然后从N中取出下一个数,即第n+1个数m,将m与堆顶A[0]比较,如果m<=A[0],直接丢弃m。

否则应该用m替换A[0]。但此时A的堆特性可能已被破坏,应该重新维护堆:从A[0]开始,将A[0]与左右子节点分别比较(特别注意,这里需要比较两次才能确定最大数,在后面我会根据这个来和败者树比较),如果A[0]比左右子节点都小,则堆特性能够保证,勿需继续,否则如左(右)节点最大,则将A[0]与左(右)节点交换,并继续维护左(右)子树。

依次执行,直到遍历完N,堆中保留的n个数就是N中最大的n个数。 这都是堆排序的基本知识,唯一的trick就是维护一个小顶堆,而不是大顶堆。

不明白的稍微想一下。维护一次堆的时间复杂度为O(logn),总体的复杂度是O(Nlogn)这样一来,比起上面的O(nN),当n足够大时,堆的效率肯定是要高一些的。

当然,直接对N数组建堆,然后提取n次堆顶就能得到结果,而且其复杂度是O(nlogN),当n不是特别小的时候这样会快很多。但是对于online数据就没办法了,比如N不能一次load进内存,甚至是一个流,根本不知道N是多少。

败者树:有没有别的算法呢?我先来说一说败者树(loser tree)。也许有些人对loser tree不是很了解,其实它是一个比较经典的外部排序方法,也就是有x个已经排序好的文件,将其归并为一个有序序列。

败者树的思想咋一看有些绕,其实是为了减小比较次数。首先简单介绍一下败者树:败者树的叶子节点是数据节点,然后两两分组(如果节点总数不是2的幂,可以用类似完全树的结构构成树),内部节点用来记录左右子树的优胜者中的败者(注意记录的是输的那一方),而优胜者则往上传递继续比较,一直到根节点。

如果我们的优胜者是两个数中较小的数,则根节点记录的是最后一次比较中的败者,也就是所有叶子节点中第二小的那个数,而最小的那个数记录在一个独立的变量中。这里要注意,内部节点不但要记录败者的数值,还要记录对应的叶子节点。

如果是用链表构成的树,则内部节点需要有指针指向叶子节点。这里可以有一个trick,就是内部节点只记录败者对应的叶子节点,具体的数值可以在需要的时候间接访问(这一方法在用数组。

6.为什么我反对纯算法面试题

我在《再谈“我是怎么招程序员”》中比较保守地说过,“问难的算法题并没有错,错的很多面试官只是在肤浅甚至错误地理解着面试算法题的目的。”

今天,我想加强一下这个观点——我反对纯算法题面试!(注意,我说的是纯算法题)图片源Wikipedia(点击图片查看词条)我再次引用我以前的一个观点——能解算法题并不意味着这个人就有能力就能在工作中解决问题,你可以想想,小学奥数题可能比这些题更难,但并不意味着那些奥数能手就能解决实际问题。好了,让我们来看一个示例(这个示例是昨天在微博上的一个讨论),这个题是——“找出无序数组中第2大的数”,几乎所有的人都用了O(n)的算法,我相信对于我们这些应试教育出来的人来说,不用排序用O(n)算法是很正常的事,连我都不由自主地认为O(n)算法是这个题的标准答案。

我们太习惯于标准答案了,这是我国教育最悲哀的地方。(广义的洗脑就是让你的意识依赖于某个标准答案,然后通过给你标准答案让你不会思考而控制你)功能性需求分析试想,如果我们在实际工作中得到这样一个题 我们会怎么做?我一定会分析这个需求,因为我害怕需求未来会改变,今天你叫我找一个第2大的数,明天你找我找一个第4大的数,后天叫我找一个第100大的数,我不搞死了。

需求变化是很正常的事。分析完这个需求后,我会很自然地去写找第K大数的算法——难度一下子就增大了。

很多人会以为找第K大的需求是一种“过早扩展”的思路,不是这样的,我相信我们在实际编码中写过太多这样的程序了,你一定不会设计出这样的函数接口 —— Find2ndMaxNum(int* array, int len),就好像你不会设计出 DestroyBaghdad(); 这样的接口,而是设计一个DestoryCity( City& ); 的接口,而把Baghdad当成参数传进去!所以,你应该是声明一个叫FindKthMaxNum(int* array, int len, int kth),把2当成参数传进去。这是最基本的编程方法,用数学的话来说,叫代数!最简单的需求分析方法就是把需求翻译成函数名,然后看看是这个接口不是很二?!(注:不要纠结于FindMaxNum()或FindMinNum(),因为这两个函数名的业务意义很清楚了,不像Find2ndMaxNum()那么二)非功能性需求分析性能之类的东西从来都是非功能性需求,对于算法题,我们太喜欢研究算法题的空间和时间复杂度了。

我们希望做到空间和时间双丰收,这是算法学术界的风格。所以,习惯于标准答案的我们已经失去思考的能力,只会机械地思考算法之内的性能,而忽略了算法之外的性能。

如果题目是——“从无序数组中找到第K个最大的数”,那么,我们一定会去思考用O(n)的线性算法找出第K个数。事实上,也有线性算法——STL中可以用nth_element求得类似的第n大的数,其利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。

Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:1)Sa中元素的个数小于k,则Sb中的第 k-|Sa|个元素即为第k大数;2) Sa中元素的个数大于等于k,则返回Sa中的第k大数。

时间复杂度近似为O(n)。搞学术的nuts们到了这一步一定会欢呼胜利!但是他们哪里能想得到性能的需求分析也是来源自业务的!我们一说性能,基本上是个人都会问,请求量有多大?如果我们的FindKthMaxNum()的请求量是m次,那么你的这个每次都要O(n)复杂度的算法得到的效果就是O(n*m),这一点,是书呆子式的学院派人永远想不到的。

因为应试教育让我们不会从实际思考了。工程式的解法根据上面的需求分析,有软件工程经验的人的解法通常会这样:1)把数组排序,从大到小。

2)于是你要第k大的数,就直接访问 array[k]。排序只需要一次,O(n*log(n)),然后,接下来的m次对FindKthMaxNum()的调用全是O(1)的,整体复杂度反而成了线性的。

其实,上述的还不是工程式的最好的解法,因为,在业务中,那数组中的数据可能会是会变化的,所以,如果是用数组排序的话,有数据的改动会让我重新排序,这个太耗性能了,如果实际情况中会有很多的插入或删除操作,那么可以考虑使用B+树。工程式的解法有以下特点:1)很方便扩展,因为数据排好序了,你还可以方便地支持各种需求,如从第k1大到k2大的数据(那些学院派写出来的代码在拿到这个需求时又开始挠头苦想了)2)规整的数据会简化整体的算法复杂度,从而整体性能会更好。

(公欲善其事,必先利其器)3)代码变得清晰,易懂,易维护!(学院派的和STL一样的近似O(n)复杂度的算法没人敢动)争论你可能会和我有以下争论,如果程序员做这个算法题用排序的方式,他一定不会像你想那么多。是的,你说得对。

但是我想说,很多时候,我们直觉地思考,恰恰是正确的路。因为“排序”这个思路符合人类大脑处理问题的方式,而使用学院派的方式是反大脑直觉的。

反大脑直觉的,通常意味着晦涩难懂,维护成本上升。就是一道面试题,我就是想测试一下你的算法技能,这也扯太多了。

没问题,不过,我们要清楚我们是在招什么人?是一个只会写算法的人,还是一个会做软件的人?这个只有你自己最清楚。这个算法题太容。

7.c语言中经典的算法

Algorithms 算法概论

短小精悍,别据一格,准经典之作。一个坏消息: 同算法导论,该书没有习题答案。好消息:习题很经典,难度也适中,只需花点点时间自己也都能做出来。不好也不坏的消息:我正在写习题的答案,已完成前三章,还剩九章约二百道题,顺利的话二个月之后发布。另有中文版名《算法概论》,我没看过,不知道翻译得怎么样。如果有心的话,还是尽量看原版吧,其实看原版与看中文版花费时间不会相差很大,因为大部分时间其实都花费在做习题上了。

编程之美--微软技术面试心得

虽说是一本面试书,但如果把前面十几页扯掉的话,我更愿意把它看作是一本讲解题思维的算法小品。在书中,作者通常是给出一个平常解法,然后再一次又一次的优化改进,你可以很清楚的看到基本的算法设计思想是如何得到运用以解决实际问题的。如果你已经有了一些算法的基础,看完本书应该能使你的算法应用能力得到一定的提高。另外,本书生动有趣,也同样适合于初学者。

算法艺术与信息学竞赛

如果算法导论是九阳神功,那这本无疑就是九阴真经。本书是专为参加一些诸如ACM之类程序设计比赛的同学而写的,江湖人称“黑书”。里面讲的都是一些在编程比赛中常用的算法、数据结构,以及一些数论和计算几何等。

经典面试算法常识题

声明:沿途百知所有(内容)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系我们将尽快删除