‘壹’ 109、微软公司一份年薪百万的工作,面试题99﹪人答错了,你能答对吗 一个人,花8元买只鸡。9元卖出去。1
这是IBM面试时的题目,有四种算法:
1、9-8=1,11-10=1,1+1=2,所以最后赚2元。
2、最初只有8块钱,最后你有11块了,
所以是赚3块;
3、第一次买卖,主人公损失8块,获得一只鸡,第二次买卖;主人公获得9块,
损失一只鸡;第三次买卖,主人公损失10块,获得一只鸡;第四买卖,主人公
获得11块,损失一只鸡
所以 整个产生的GDP(国内生产总值)是8+9+10+11=38元+4只鸡
4、整个事件有3次交易,我门来看看具体是哪3次?
第一次交易:8元买进,9元卖出,利润1元;
第二次交易:9元卖出,10元买进,利润-1元;
第三次交易:10元买进,11元卖出利润1元;
整个过程:1-1+1=1元
所以分析得知:这个人是个傻子,因为后两次交易等于白干了。
经测试,企业认为:
回答利润是2元的肯定是面试失败者;
回答3元的更为愚蠢,因为自己什么是追加成本都不知道,肯定也是失败;
回答1元者,恭喜你,不属于傻子范围;
结果是:本来可以直接赚3元的,经过他3次交易后总利润变成1元了。
所以正确答案是:-2元!
回答-2元者,恭喜!面试成功!!!
美国应聘者认为赚了2美元,日本应聘者认为亏了2美元,而中国人认为亏了4美元。
美国应聘者的解题思路——同样的鸡,第一次8买9卖,9-8=1,赚1美元。第二次10买11卖,11-10=1,赚1美元。两次交易相加,1+1=2,所以答案是赚2美元。
日本应聘者的解题思路——同样的鸡,如果在8美元的价位上一次买两只然后分别在9美元和11美元的价位上先后卖出,那么第一次交易8买9卖,9-8=1,赚1美元。第二次交易8买11卖,11-8=3,赚3美元。两次交易相加,本来应赚4美元,1+3=4。但贩鸡者实际只赚了2美元,(9-8)+(11-10)=2,所以答案是亏2美元,2-4=-2。
中国应聘者的解题思路——同样的鸡,如果在8美元的价位上一次买两只然后在11美元的价位上一次性出手,那么就应该赚6美元,8买11卖,(11-8)×2=6。但贩鸡者实际只赚了2美元,(9-8)+(11-10)=2,所以答案是亏了4美元,2-6=-4。
面试官大为佩服中国应聘者的解题思路和答案,于是美国应聘者和日本应聘者落聘,中国应聘者成功通过面试,进入花旗集团工作。
这位成功应聘花旗集团的中国人名叫沈南鹏,担任过携程网执行董事、首席财务官。离开携程后,沈南鹏加入红杉基金,出任创始合伙人。2009年12月15日,被《福布斯》中文版杂志评选为 “2009福布斯中国最佳创业投资人”,位列第五。
从常规思路来看,似乎美国应聘者比较呆板,既不能以前瞻性的目光和跳跃性的思维去看待和把握市场物价的变化规律,也缺乏投资必须追求最大效益的意识,所以就认同了“两次买两次卖”的笨劣做法,机械地据题解题,进而得出赚了2美元的答案。
日本应聘者则比较灵光,他以前瞻性的目光和跳跃性的思维去看待和把握市场物价的变化规律,所以就没有认同贩鸡者“两次买两次卖”的笨劣做法,在解题过程中提出了“一次买两次卖”的投资方案,比美国应聘者的投资方案可以多赚2美元,进而得出亏了2美元的答案。
中国应聘者沈南鹏却既能以前瞻性的目光和跳跃性的思维去看待和把握市场物价的变化规律,又具有投资必须追求最大效益意识,于是提出了“一次买一次卖”的“最优方案”,所以就得出亏了4美元的答案。
‘贰’ 国内外着名的面试题有哪些
微软面试题面试官询问的刁钻问题(1)
你可能已经读过求职方面的书,并在心里反复温习了面试标准问题的答案。但是如果面试官提的是其他问题,一些你没有想到的问题,这时该怎么办?这样的问题可能是最难的,因为它们会表明你的思维的敏捷程度。它们可能非常有诱惑力,让你戒备心全无,从而中了面试官的圈套,展现出自己的方方面面,包括你原本不打算暴露出来的某些个性。
1.“你最近读了什么书?”在应聘法院书记员的职位时,有三位联邦法官问到我这个问题。我告诉他们我正在读的小说的名字。有一名法官说从来没有听说过这本书,另一个说自己只读蒙大拿州作家的书,第三个说知道这本书的作者,并在新闻方面与我有着同样的兴趣。——安妮·玛丽,1999年4月23日我们的建议:最好是从这个问题与这份工作之间有什么关系的角度来考虑。谈一些热门的与法律有关的期刊或书籍要好于谈自己正在读的小说。虽然你也许会发现面试官与你有着同样的文学方面的兴趣,但是面试官问这个问题的目的其实是想知道你是否了解专业领域的最新发展状况。
2.当我听到“XX年后你希望自己是什么状况”这个问题时,我试图用幽默的方式回答这个问题(比如,希望在彩票中奖后去热带地区生活),不过我想知道专业人士为什么会提出这个问题。——苏珊,1999年4月29日我们的建议:你的直觉是正确的!他们到底想知道什么?“五年以后,我希望自己仍在努力工作,而且能够把工作做到最好。”这样的答案会让面试官觉得你工作努力,而且给自己设立了高标准。你也可以表示想继续学习,为自己所从事的这个领域创造更大的价值。
3.我一直想知道的是,当那些老板问“你的缺点是什么”时,他们到底想听到什么。告诉他们你有爱吃巧克力这个缺点吗?还是告诉他们你的缺点就是不肯告诉别人自己的缺点?你知道如何回答这样的问题吗?——芭芭拉,1999年4月30日我们的建议:这是一个非常常见的问题。如果你说自己没有缺点,那会显得骄傲自大。如果你用幽默的方式回答这个问题,会显得太轻浮。这是一个不好回答的问题,面试官想看你如何处理这样的问题。谈一个从其他角度来看是长处的缺点。千万不要落入面试官的圈套,把对方视为母亲、父亲或是听忏悔的神父,说一些关系到能否得到这个工作的重要内容!一种好的回答方式是:“我很难和不尽职尽责的人一起工作。我对自己的工作有很高的标准,我希望别人也给自己设立高标准。我正学着在为不公平的境遇气恼之前,明确要求别人更投入地对待自己的工作。”还要指出自己怎样克服这个缺点。
4.几年来,我遇到了三个刁钻的问题。可惜的是,我因没有心理准备而未能给出令人满意的答复。(1)你的约会很多吗?(问这个问题的是美国一家防务公司的一名女面试官。)(2)你今天为什么来这里?(一家投资银行的面试官走进他的办公室,看到我坐在那里等他时所问的问题。)(3)如果此时外面有一艘宇宙飞船着陆,你会走进去吗?如果它可以去任何一个地方,你会要求它把你带到哪里?(一家投资银行的面试官所问的问题。)——凯利,1999年5月3日我们的建议:这几个问题都具有挑战性。虽然第一个问题看上去有点不同寻常,是一名女性向另一名女性提出的问题,但你仍需要认真作答,让对方感到满意。比较好的回答方式是:“如果你担心我对私人生活的关注程度大于对工作的关注程度,那么我想向你保证,我对工作非常投入。同样,我努力保持平衡的生活,以各种各样的方式充实我的业余生活。”这既回答了面试官提出的问题,也没有侵犯自己的隐私。“你今天为什么来这里”这样的问题给你提供了一个阐述自己对这份工作的热情的机会。如果你不是从这句话的表面意思去看,那么这就是一个刁钻的问题。在接受面试时,很重要的一点是,让自己轻松一点,不要分析每个问题到底是什么意思。想方设法让你的回答能够拉近你与面试官之间的关系,并表明你作为这个职位的应聘者,有着自己的优势。“我来这里是要和你讨论一下我应聘某某工作的问题。你愿意听我介绍一下自己的情况吗?”(如果面试官那天面试的不止是应聘这个岗位的人,那么他可能也会提这样的问题。)宇宙飞船这个问题问的是你有多大的冒险精神。要回答这个问题,需要根据你对自己所应聘的工作的了解好好组织自己的语言。假如这项工作要求你具有创新精神,那么你可以说:“是的,我会上去,去见见曾经在这个星球上走过的那些最具有创新精神的人,问问他们最喜欢用什么方式来让自己尽可能保持创造力。”
5.你是愿意做一个大池塘里的一条小鱼,还是愿意做一个小池塘里的一条大鱼?一个小池塘里的一条大鱼——那么池塘就属于我了,但是没有什么可让我征服的。一个大池塘的一条小鱼——这样的话我就有很多成功的机会!!!——斯科特,1999年5月6日我们的建议:听起来你回答得不错,但是你要随机应变。如果你想在一个大型的财富500强企业觅得一个职位,那么这个回答很合适。可是如果你是在一家规模不大的企业接受面试,那么这样的回答会让人感觉你做这份工作有些屈才。这个问题没有最佳答案——只有对于所应聘的工作及当时的情形来说最合适的答案。
微软面试题面试官询问的刁钻问题(2)
如果你的事业能从头再来,你会有怎样的变化?没有什么……我现在很开心,所以我不想有任何的改变。你目前可以选择的职业是什么?“我感兴趣的领域有三个……”谈谈具体的职位和所属的行业。你认为成功的本质是什么?根据你对成功的定义,你到目前为止取得了多大的成功?仔细考虑如何作答,并联系自己在事业上取得的成就。你对我们公司有多少了解?一定要有备而来!花点时间在网上或图书馆里查阅有关这家公司的情况。尽可能多地了解一些信息,包括它的产品、规模、收入、声誉、形象、管理人才、员工、技能、历史以及所信奉的哲学等。表现出对公司的兴趣;让面试官向你讲述关于这家公司的情况。你为什么想为我们工作?不要谈你想要什么。首先谈他们需要什么:你希望投身于公司的某项具体计划;你希望能解决公司存在的某个问题;你能为公司某个具体的目标做出贡献。你能为我们做些什么?你能为我们做别人所不能做的什么事情?以过去的经历为例,谈谈你曾经成功地为前雇主解决过可能与这家公司所面临的问题类似的问题。你认为这份工作最吸引你的是哪些地方?不吸引你的是哪些地方?列举三个以上吸引你的因素,只列举一个不吸引你的因素。我们为什么要雇用你?因为你的知识、经验、能力和技能。你对这份工作有什么期望?希望能提供一个利用自己的技能、展示自我并得到别人认可的机会。请告诉我你给你要应聘的这个职位所下的定义是什么?要简明扼要——给出一个以行动和成果为主导的定义。你要在多长时间以后才能为我们公司做出重要贡献?不需要多长时间——你预计在经过短暂的适应期后,你就会为公司做出贡献。你会在我们这里干多长时间?只要我们彼此都感到我在为公司做贡献、在取得成绩、在进步,我就会干下去。如果我和你过去的老板谈,你认为他会说你的强项和弱点分别是什么?强调技能——不要过于否定自己的弱点;无论何时,说自己在某方面的技能仍需改善总比说自己的缺点更安全。你能在有压力和最后期限的情况下工作吗?能,商界向来如此。你如何改变自己的工作?当然是让它越来越完善。你更喜欢管理工作还是生产工作?这取决于是什么工作,以及它所构成的挑战。现在看来,你认为自己过去所忽视的问题是什么?回答要简练,不要夸夸其谈。你认为自己在一个规模、类型不同的公司会有更好的表现吗?这取决于是什么工作——谈得稍微详细一些。你如何化解一个攻关小组内部的冲突?首先在私下里谈这个问题。你做过的最困难的一个决定是什么?设法将自己的答案与应聘这份工作联系在一起。在此之前,你为什么没有找到一个新职位?找个工作很简单;找到合适的工作就难了。(言外之意是你一直很“挑剔”。)你过去想过要辞去目前的这份工作吗?如果想过,你认为是什么让你没有立刻辞职?是这份工作所带来的挑战,可是现在这种挑战没有了。你对自己的老板有什么看法?尽可能发表积极的看法。你能形容一下在什么情况下自己的工作受到批评吗?尽可能发表积极的看法。你在考虑的还有其他什么类型的工作及公司?答案要与这家公司所从事的行业有关联。你为什么要辞去目前的工作?要在让自己感到舒服,而且做到诚实的情况下简练地回答这个问题。如果可能的话,给出一个客观的理由,比如我们的部门被合并了或取消了。你对失去所有那些好处有什么感受?有点担心,但并不惊慌。描绘一下你理想的工作环境。一个公平对待每个员工的工作环境。你如何评价目前就职的这家公司?一家给我带来许多宝贵经验的好公司。
微软面试题微软公司的面试问题(1)
以下是微软公司的员工在面试时所遇到的问题。微软的顾问有时会得到一些特殊待遇,因此在面试时询问他们的问题并不真的算数,所以没有列在下面。这些问题往往遵循以下一些基本主题:难题、运算、应用、头脑。难题★为什么下水道的井盖是圆的?
★美国有多少辆车?(一个常见的类似问题是:美国有多少家加油站?)
★美国有多少个下水道井盖?
★你让某些人为你工作了七天,你要用一根金条作为报酬。这根金条要被分成七块。你必须在每天的活干完后交给他们一块。如果你只能将这根金条切割两次,你怎样给这些工人分?
★一列火车以每小时15英里的速度离开洛杉矶,朝纽约进发。另外一列火车以每小时20英里的速度离开纽约,朝洛杉矶进发。如果一只每小时飞行25英里的鸟同时离开洛杉矶,在两列火车之间往返飞行,请问当两列火车相遇时,鸟飞了多远?
★假设一张圆盘像唱机上的唱盘那样转动。这张盘一半是黑色,一半是白色。假设你有数量不限的一些颜色传感器。要想确定圆盘转动的方向,你需要在它周围摆多少个颜色传感器?它们应该被摆放在什么位置?
★假设时钟到了12点。注意时针和分针重叠在一起。在一天之中,时针和分针共重叠多少次?你知道它们重叠时的具体时间吗?
★你有两个罐子,分别装着50个红色的玻璃球和50个蓝色的玻璃球。随意拿起一个罐子,然后从里面拿出一个玻璃球。怎样最大程度地增加让自己拿到红球的机会?利用这种方法,拿到红球的几率有多大?
★中间只隔一个数字的两个奇数被称为奇数对,比如17和19。证明奇数对之间的数字总能被6整除(假设这两个奇数都大于6)。现在证明没有由三个奇数组成的奇数对。
★一个屋子有一个门(门是关闭的)和3盏电灯。屋外有3个开关,分别与这3盏灯相连。你可以随意操纵这些开关,可一旦你将门打开,就不能变换开关了。确定每个开关具体管哪盏灯。
★假设你有8个球,其中一个略微重一些,但是找出这个球的惟一方法是将两个球放在天平上对比。最少要称多少次才能找出这个较重的球?
★假设你站在镜子前,抬起左手,抬起右手,看看镜中的自己。当你抬起左手时,镜中的自己抬起的似乎是右手。可是当你仰头时,镜中的自己也在仰头,而不是低头。为什么镜子中的影像似乎颠倒了左右,却没有颠倒上下?
★你有4瓶药。每粒药丸的重量是固定的,不过其中有一瓶药受到了污染,药丸的重量发生了变化,每个药丸增加了一点重量。你怎样一下子测出哪瓶药是遭到污染的呢?
★下面玩一个拆字游戏,所有字母的顺序都被打乱。你要判断这个字是什么。假设这个被拆开的字由5个字母组成:1.共有多少种可能的组合方式?2.如果我们知道是哪5个字母,那会怎么样?3.找出一种解决这个问题的方法。
★有4个女人要过一座桥。她们都站在桥的某一边,要让她们在17分钟内全部通过这座桥。这时是晚上。她们只有一个手电筒。最多只能让两个人同时过桥。不管是谁过桥,不管是一个人还是两个人,必须要带着手电筒。手电筒必须要传来传去,不能扔过去。每个女人过桥的速度不同,两个人的速度必须以较慢的那个人的速度过桥。第一个女人:过桥需要1分钟;第二个女人:过桥需要2分钟;第三个女人:过桥需要5分钟;第四个女人:过桥需要10分钟。比如,如果第一个女人与第4个女人首先过桥,等她们过去时,已经过去了10分钟。如果让第4个女人将手电筒送回去,那么等她到达桥的另一端时,总共用去了20分钟,行动也就失败了。怎样让这4个女人在17分钟内过桥?还有别的什么方法?
★如果你有一个5夸脱的水桶和一个3夸脱的水桶,如何准确量出4夸脱的水?
★你有一袋糖,有红色的,蓝色的,绿色的。闭上眼睛,拿出两块颜色一样的糖,你需要拿多少次才能确保有两块颜色相同的?
★如果你有两个桶,一个装的是红色的颜料,另一个装的是蓝色的颜料。你从蓝色颜料桶里舀一杯,倒入红色颜料桶,再从红色颜料桶里舀一杯倒入蓝颜料桶。两个桶中红蓝颜料的比例哪个更高?通过算术的方式来证明这一点。
微软面试题微软公司的面试问题(2)
运算
★链接表和数组之间的区别是什么?
★做一个链接表,你为什么要选择这样的方法?
★选择一种算法来整理出一个链接表。你为什么要选择这种方法?现在用O(n)时间来做。
★说说各种股票分类算法的优点和缺点。
★用一种算法来颠倒一个链接表的顺序。现在在不用递归式的情况下做一遍。
★用一种算法在一个循环的链接表里插入一个节点,但不得穿越链接表
用一种算法整理一个数组。你为什么选择这种方法?
★用一种算法使通用字符串相匹配。
★颠倒一个字符串。优化速度。优化空间。
★颠倒一个句子中的词的顺序,比如将“我叫克丽丝”转换为“克丽丝叫我”,实现速度最快,移动最少。
★找到一个子字符串。优化速度。优化空间。
★比较两个字符串,用O(n)时间和恒量空间。
★假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?★不用乘法或加法增加8倍。现在用同样的方法增加7倍。
微软面试题微软公司的面试问题(3)
应用
★如何将计算机技术应用于一幢100层高的办公大楼的电梯系统上?你怎样优化这种应用?工作日时的交通、楼层或时间等因素会对此产生怎样的影响?
★你如何对一种可以随时存在文件中或从因特网上拷贝下来的操作系统实施保护措施,防止被非法复制?
★你如何重新设计自动取款机?
★假设我们想通过电脑来操作一台微波炉,你会开发什么样的软件来完成这个任务?
★你如何为一辆汽车设计一台咖啡机?
★如果你想给微软的Word系统增加点内容,你会增加什么样的内容?
★你会给只有一只手的用户设计什么样的键盘?
★你会给失聪的人设计什么样的闹钟?
微软面试题微软公司的面试问题(4)
头脑
★如果你有一个许多部件可以拆卸的时钟,你将它一块块拆开,但是没有记住是怎样拆的。然后你将各个零件重新组装起来,最后发现有三个重要零件没有放进去。这时你如何重新组装这个时钟?
★如果你需要学习一门新的计算机语言,你会怎样做?
★假设由你负责设计比尔·盖茨的卫生间。当然,钱不成问题,但是你不可以和比尔谈。你会怎样做?
★到目前为止,你遇到的最难回答的问题是什么?
★如果微软公司说,我们愿意投资500万美元用来开发你提出的方案。那么你会做什么?为什么?
★如果你将世界上所有的计算机制造商召集起来,告诉他们必须要做一件事,你会让他们做什么事?
★如果你在五年内会得到一笔奖金,你认为会是因为什么?关注你的成绩的人会是谁?
★你如何教自己的奶奶使用微软Excel表格系统?
★为什么当我们在任何一家宾馆打开热水龙头时,热水会马上流出来?
★你为什么想在微软工作?
★假设你回到家,进入自己的房间,打开电灯开关,可是一点反应都没有——灯没有亮。这时,你在判断问题出在哪里时,会依次采取怎样的做法?
由于有很多问题,而网络篇幅太小,如果你要的话,留个邮箱我发给你。。。。
‘叁’ 进入IT企业必读的200个 .NET面试题的目 录
第1章 应聘开发职位的技巧和禁忌 1
程序员在准备面试的过程中,有时会过分注重技术上的准备工作,事实上,一些非技术的准备工作也相当重要。掌握好应聘技术职位过程中的软技巧、准备一份出色的简历、提高警惕避免在应聘中触犯一些禁忌,可以大大地提高面试的成功率。在开始面试时,还要把握一些强势的招聘网站,给自己一个展现自我的平台。本章从了解、准备、开始,层层渐进,让读者对整个程序员面试的过程有个全局性的掌握。
1.1 技术职位需要怎样的人才——了解大环境 1
1.1.1 对技术的执着和热情 1
1.1.2 对编程始终抱有认真的态度 1
1.1.3 实事求是的态度和谦逊的品质 1
1.1.4 适合应聘公司的文化 1
1.2 一份出色的个人简历——面试准备 2
1.2.1 一份简历不宜超过一页 2
1.2.2 永远准备中文简历 2
1.2.3 不要在个人简历上注明希望薪水 2
1.2.4 简历模板 2
1.3 展现自我——开始发简历 3
1.3.1 应聘渠道 3
1.3.2 应聘流程 7
1.4 真正的面试——开始面试 8
1.4.1 笔试 8
1.4.2 面试 10
1.4.3 电话面试 10
1.4.4 网络考试 10
1.5 面试中的一些禁忌 11
1.6 小结 12
第2章 .NET框架基础 13
本章覆盖了.NET面试笔试中常见的.NET框架技术题。此类题目侧重于考查应聘者对于.NET机制的深入了解,彻底理解.NET的运行机制,并且熟悉一个.NET系统常用的管理部署方法。
2.1 .NET基础概念 13
2.1.1 什么是CTS、CLS和CLR 13
2.1.2 开发和运行.NET程序需要的
最基本环境是什么 15
2.1.3 .NET是否支持多编程语言开发 15
2.1.4 CLR技术和COM技术的比较 17
2.1.5 什么是程序集和应用程序域 18
2.2 .NET运行机制 20
2.2.1 .NET程序被编译成什么形式的代码 20
2.2.2 JIT是如何工作的 22
2.2.3 简述程序集的加载机制 23
2.2.4 如何配置程序集的版本策略 25
2.3 生成、部署和管理 27
2.3.1 如何生成强签名的程序集 27
2.3.2 如何把程序集放入GAC中 29
2.3.3 延迟签名及其作用 30
2.3.4 程序集的版本分哪几部分 32
2.4 名企面试真题 32
2.5 小结 33
第3章 .NET类型语法基础 34
本章覆盖了.NET面试笔试中最基础的语法和类型题。纵观.NET的面试题,此类题目涉及了最基础的知识点,其难度也相对最小。但是应聘者如果对此类的面试题回答得不正确或者不完整,将会给面试官留下技术水平较差的印象,建议读者对本章的题目做到深刻理解和掌握。
3.1 基础类型和语法 34
3.1.1 .NET中所有内建类型的基类是什么 34
3.1.2 System.Object中包含哪些方法,哪些是虚方法 35
3.1.3 值类型和引用类型的区别 37
3.1.4 简述装箱和拆箱原理 40
3.1.5 C#中是否有全局变量 43
3.1.6 struct和class的区别,
struct适用哪些场合 43
3.1.7 类型的初始化器何时被调用 44
3.1.8 C#中方法的参数可以有哪几种传递方式 47
3.1.9 C#中string和String有什么区别 50
3.1.10 .NET支持哪几种可访问性级别,C#实现了其中的哪几种 50
3.1.11 简述属性的特点及属性和方法的异同 51
3.1.12 简述C#中的浅复制和深复制 54
3.1.13 简述C#中的循环语法和各自的特点 57
3.1.14 C#中的using语句有什么作用 60
3.2 内存管理和垃圾回收 62
3.2.1 简述.NET中堆栈和堆的特点和差异 62
3.2.2 执行string abc=aaa+bbb+ccc共分配了多少内存 64
3.2.3 .NET中GC的运行机制 66
3.2.4 Dispose方法和Finalize方法在何时被调用 67
3.2.5 GC中代(Generation)是什么,一共分几代 70
3.2.6 GC机制中如何判断一个对象是否仍在被使用 71
3.2.7 .NET的托管堆中是否可能出现内存泄漏现象 72
3.3 面向对象的实现 75
3.3.1 C#中类可以有多个父类、可以实现多个接口吗 75
3.3.2 简述C#中重写、重载和隐藏的概念 76
3.3.3 为什么在构造方法中调用虚方法会导致问题 78
3.3.4 在C#中如何声明一个类不能被继承 82
3.4 异常的处理 82
3.4.1 如何针对不同的异常进行捕捉 82
3.4.2 如何使用Conditional特性 84
3.4.3 如何避免类型转换时的异常 86
3.5 名企面试真题 88
3.6 小结 89
第4章 字符串、集合和流的使用 90
字符串、集合和流在程序中处理数据时经常被用到,这些代码的编写将直接影响到系统的正确性和效率。本章将包含关于字符串、集合和流的常见面试题,并且通过分析这些题目和知识点,帮助读者梳理这些方面的知识。
4.1 字符串处理 90
4.1.1 System.String是值类型还是引用类型 90
4.1.2 StringBuilder类型有何作用 91
4.1.3 如何在String和Byte[]对象之间进行转换 92
4.1.4 简述BASE64编码的作用以及C#中对其的支持 94
4.1.5 SecureString的实例如何被分配和释放 96
4.1.6 什么是字符串池机制 98
4.2 常用集合和泛型 99
4.2.1 Int[]是引用类型还是值类型 99
4.2.2 数组之间如何进行转换 100
4.2.3 解释泛型的基本原理 102
4.2.4 什么是泛型的主要约束和次要约束 104
4.2.5 .NET中是否可用标准模板库(STL) 105
4.3 流和序列化 106
4.3.1 什么是流,.NET中有哪些常见的流 106
4.3.2 如何使用压缩流 109
4.3.3 Serializable特性有何作用 111
4.3.4 .NET提供了哪几种可进行序列化操作的类型 113
4.3.5 如何自定义序列化和反序
列化的过程 116
4.4 名企面试真题 119
4.5 小结 119
第5章 常用类和接口 120
.NET除了提供运行引擎之外,还提供了丰富的内建类型。理解这些类型的作用和机制,能够帮助程序员减少代码工作,编写高效简洁的代码。而有时候误用类型,则会导致性能的降低,更严重时则会为系统带了潜伏的bug。本章将介绍一些经常出现在.NET面试中的类型和接口。
5.1 类型的基类System.Object 120
5.1.1 是否存在不继承自System.Object类型的类 120
5.1.2 在System.Object中定义的三个比较方法有何异同 122
5.1.3 如何重写GetHashCode方法 125
5.2 时间的操作System.DateTime 127
5.2.1 DateTime如何存储时间 127
5.2.2 如何在DateTime对象和
字符串对象之间进行转换 127
5.2.3 什么是UTC时间,如何转换到UTC时间 130
5.3 IFormattable和IformatProvider的使用 131
5.3.1 如何使用IFormattable接口实现格式化输出 131
5.3.2 如何告诉类型格式化输出的方式 133
5.4 管理文件和文件夹的类型 135
5.4.1 如何操作文件和文件夹 135
5.4.2 如何实现文件和文件夹的监控功能 139
5.5 .NET中的定时器 141
5.5.1 .NET提供了哪几个定时器类型 141
5.5.2 .NET的内建定时器类型
是否会发生回调方法重入 146
5.6 名企面试真题 151
5.7 小结 151
第6章 .NET中的高级特性 152
本章的内容覆盖了诸如委托、事件、反射和特性等.NET框架中的高级特性。对这些特性的掌握和成熟运用,往往成为.NET程序员从入门级进阶到中级的判断标准。也正因为如此,此类题目在.NET技术笔试、面试中被大量采用。读者在阅读本章时,应力求做到知其然更知其所以然,充分理解各种特性在.NET框架下是如何实现的,这样的设计如何提高了程序的灵活性和可扩展性。
6.1 委托 152
6.1.1 请解释委托的基本原理 152
6.1.2 委托回调静态方法和实例方法有何区别 154
6.1.3 什么是链式委托 154
6.1.4 链式委托的执行顺序是怎么样的 156
6.1.5 可否定义拥有返回值的方法的委托链 157
6.1.6 委托通常可以应用在哪些场合 159
6.2 事件 165
6.2.1 请解释事件的基本使用方法 165
6.2.2 事件和委托有何联系 167
6.2.3 如何设计一个带有很多事件的类型 169
6.2.4 用代码表示如下情景:猫叫、老鼠逃跑、主人惊醒 173
6.3 反射 175
6.3.1 请解释反射的基本原理和其实现的基石 176
6.3.2 .NET提供了哪些类型来实现反射 179
6.3.3 如何实现动态地发射程序集 184
6.3.4 如何利用反射来实现工厂模式 188
6.3.5 如何以较小的内存代价保存
Type、Field和Method信息 194
6.4 特性 196
6.4.1 什么是特性,如何自定义一个特性 196
6.4.2 .NET中特性可以在哪些元素上使用 198
6.4.3 有哪几种方法可以获知一个元素是否申明某个特性 200
6.4.4 一个元素是否可以重复申明同一个特性 202
6.5 名企面试真题 204
6.6 小结 204
第7章 .NET多线程编程 205
多线程编程是每个技术框架下都需要面对的问题,在多CPU、多核的硬件架构逐渐普及的今天,多线程编程也渐渐变得更加重要。本章将集中覆盖关于.NET中多线程编程的面试题。
7.1 多线程编程的基本概念 205
7.1.1 请解释操作系统层面上的线程和进程 205
7.1.2 多线程程序在操作系统里是并行执行的吗 206
7.1.3 什么是纤程 207
7.2 .NET中的多线程编程 208
7.2.1 如何在.NET程序中手动控制多个线程 208
7.2.2 如何使用.NET的线程池 212
7.2.3 如何查看和设置线程池的上下限 215
7.2.4 如何定义线程独享的全局数据 217
7.2.5 如何使用异步模式读取一个文件 221
7.2.6 如何阻止线程执行上下文的传递 223
7.3 多线程程序的线程同步 227
7.3.1 什么是同步块和同步块索引 227
7.3.2 C#中的lock关键字有何作用 229
7.3.3 可否使用值类型对象来
实现线程同步 232
7.3.4 可否对引用类型对象自身进行同步 233
7.3.5 什么是互斥体,Mutex类型和Monitor类型的功能有何区别 235
7.4 名企面试真题 238
7.5 小结 238
第8章 ASP NET应用开发 239
ASP NET是微软公司提供的编写动态网站的技术框架,其特点是基于.NET框架基础,所有ASP NET程序都可以使用针对.NET的语言编写。在微软公司的Visual Studio开发平台中,实现了拖放控件等便捷的功能,使得ASP NET应用程序的开发效率得到了较大的提高,近些年来ASP NET技术逐渐成为网站开发的主流技术之一,本章将覆盖一些常见的关于ASP NET开发的面试题。
8.1 ASP NET应用开发基础 239
8.1.1 请解释ASP NET以什么形式运行 239
8.1.2 常见的HTTP Code有哪些 242
8.1.3 GET请求和POST请求有何区别 245
8.1.4 介绍ASP NET的页面生存周期 247
8.2 控件和页面 249
8.2.1 什么是静态页面,什么是动态页面 250
8.2.2 请简述ViewState的功能和实现机制 251
8.2.3 Session有哪几种存储方式,之间有何区别,如何进行设置 255
8.2.4 如何嵌套使用GridView控件 259
8.2.5 列举几种实现页面跳转的方法,并说明其实现机制 263
8.2.6 请解释<%# Eval(source)%>的功能和实现机制 270
8.2.7 ObjectDataSource控件有何作用 273
8.3 验证和安全 277
8.3.1 如何使用正则表达式来验证一个
上海市电话号码 277
8.3.2 介绍ASP NET验证控件的功能和
使用方法 280
8.3.3 如何防止SQL注入式攻击 287
8.4 名企面试真题 289
8.5 小结 289
第9章 .NET中的数据库开发 290
大部分系统都会包含数据库应用。数据库应用设计往往成为系统设计中最重要的组成之一,这其中不止包括数据库的架构、库结构的设计,也包括了程序访问数据库策略的设计。在.NET的程序开发中,ADO NET已经成为访问数据库最主要的组件框架。本章将覆盖和数据库访问及ADO NET有关的常见面试题,具体会覆盖ADO NET基本概念、数据库的链接、数据库读写等主题。
9.1 ADO NET和数据库程序基础 290
9.1.1 什么是关系型数据库 290
9.1.2 如何通过SQL语句来实现行列转换 291
9.1.3 ADO NET支持哪几种数据源 293
9.2 ADO NET和数据库的连接 295
9.2.1 请简要叙述数据库连接池的机制 295
9.2.2 如何提高连接池内连接的重用率 298
9.2.3 一个连接字符串可以包含哪些属性 300
9.2.4 CommandBehavior.CloseConnection有何作用 302
9.3 使用ADO NET读写数据库 305
9.3.1 ADO NET支持哪两种方式来访问关系数据库 305
9.3.2 什么是强类型的DataSet 309
9.3.3 请解释SqlDataAdapter的
基本工作机制 312
9.3.4 如何自动生成SqlDataAdapter的
更新命令 316
9.3.5 如何实现批量更新的功能 319
9.4 名企面试真题 321
9.5 小结 321
第10章 XML的应用和处理 322
XML可算是近10年来最炙手可热的技术之一,由于其跨平台的特性,很多技术应用都选择基于XML来进行发展。在.NET中,对XML的支持和应用随处可见。例如配置文件的格式、数据结构的表示、Web Service应用等,都是以XML语法为基础的。本章将详细覆盖常见的关于XML本身及其在.NET中应用的面试题。
10.1 XML的基本特性 322
10.1.1 什么是XML 322
10.1.2 简述XML的常用领域及其优势 323
10.1.3 XML中<![CDATA[ ]]>标签的作用 324
10.1.4 XML规范是否允许空的属性值 325
10.1.5 XML中如何处理诸如“<”的字符 326
10.1.6 XML中的命名空间如何使用 328
10.2 使用.NET组件读写XML 330
10.2.1 .NET中操作XML的基本类型有哪些 330
10.2.2 如何使用XmlDocument类型操作XML文档的节点和属性 334
10.2.3 如何使用XPath来指向带有属性的节点 337
10.2.4 .NET中如何验证一个XML文档的格式 338
10.2.5 .NET中XML文档和关系模式如何转换 340
10.3 利用XSLT处理XML文档 344
10.3.1 什么是XSLT,XSLT有何作用 344
10.3.2 如何使用XSLT中的模板 346
10.3.3 如何在XSLT文档中调用
其他XSLT文档 349
10.3.4 如何在代码中使用XSLT文档 351
10.4 名企面试真题 353
10.5 小结 353
第11章 Web Service的开发与应用 354
Web Service是一种网络服务,形式非常类似于当前智能手机上的应用。通过通用的规范,Web Service技术允许使用者访问网络上每一个Web Service所提供的服务。在网络快速发展的今天,这种基于网络的分布式服务已经被广泛地应用。本章将讨论关于.NET中如何应用Web Service的面试题。
11.1 SOAP和Web Service的基础概念 354
11.1.1 请简述SOAP协议 354
11.1.2 什么是WSDL,它有何作用 356
11.1.3 Web Service中如何处理附件 357
11.2 使用.NET开发Web Service 360
11.2.1 如何在.NET中创建Web Service 360
11.2.2 WebMethod特性包含哪些属性,各有何用处 363
11.2.3 如何生成Web Service代理类型 367
11.2.4 请简述.NET中Web Service的异常机制 368
11.3 Web Service的安全机制 371
11.3.1 请简要介绍WS-Security的签名机制 371
11.3.2 WS-Security规范申明了哪几种身份验证的方法 373
11.4 名企面试真题 375
11.5 小结 375
第12章 .NET Remoting分布式应用开发 376
在企业级应用开发中,分布式开发占据了越来越重要的地位。.NET Remoting是一种可扩展性很高的分布式开发技术,相对于DCOM、CORBA、RMI等分布式开发技术而言,.NET Remoting拥有着众多独特的优势。.NET Remoting是一个庞大的技术话题,如果详细展开的话可能要占据一本书的篇幅。本章主要针对那些经常出现在.NET面试中的、与Remoting基础相关的面试题。
12.1 .NET Remoting框架基础 376
12.1.1 请简要介绍.NET Remoting的运行机制 376
12.1.2 请列举.NET Remoting机制中有哪些组件可以扩展替换 379
12.1.3 请简述.NET Remoting生存周期机制 384
12.2 使用.NET Remoting进行分布式应用开发 387
12.2.1 请介绍服务端激活模式和客户端激活模式的区别 387
12.2.2 请简述Remoting中有哪几种远程调用方式 390
12.2.3 Remoting机制中如何处理以ObjRef为参数的方法调用 393
12.2.4 请简述Remoting中配置文件的使用 397
12.2.5 如何在客户端和服务器端共享远程对象类型 400
12.3 名企面试真题 404
12.4 小结 404
第13章 代码和算法 405
无论是面试还是笔试,算法和代码的问题都是必不可少的,其区别仅在于笔试中更侧重于应聘者书写代码的能力,而面试中则更注重于应聘者的设计能力和算法思路。本章着重覆盖了一些在.NET面试中经常出现的和代码、算法有关的面试题,并且给出了解答思路和实现示例。
13.1 基础算法题 405
13.1.1 请实现一个快速排序算法 405
13.1.2 请实现一个二分查找算法 406
13.1.3 请实现一棵二叉树的中序、后序遍历 408
13.1.4 请写出一个奇偶分割算法 413
13.1.5 请实现一个简单的最短路径算法 414
13.2 程序设计题 423
13.2.1 请编程实现斐波拉契数列问题 423
13.2.2 请设计窗口程序演示八皇后问题 425
13.3 名企面试真题 432
13.4 小结 432
第14章 .NET中的单元测试 433
单元测试是软件开发中必不可少的一个环节,单元测试的优劣直接影响到集成测试、系统测试的效果,甚至会影响到最终产品的质量。大多数开发团队对单元测试非常重视,并且要求程序员掌握相应的知识。本章将覆盖在.NET面试中经常出现的关于单元测试的面试题。
14.1 单元测试基础概念 433
14.1.1 请简述单元测试的作用和其优点 433
14.1.2 请举例说明TDD开发方式的流程 434
14.1.3 请编写实现阶乘功能模块的测试用例 437
14.2 使用NUNIT进行单元测试 439
14.2.1 如何使用NUNIT来进行单元测试 439
14.2.2 如何对NUNIT的测试用例进行分类 442
14.2.3 请解释SetUp、TearDown、TestFixtureSetUp和
TestFixtureTearDown 446
14.3 名企面试真题 448
14.4 小结 448
‘肆’ 微软的面试会提问哪些问题
如果是校园招聘,一般是数据结构、算法,不过要英语厉害,有印度工程师直接出算法题面试;如果电话面试,一般问一下专业和编程语言中的一些概念;
‘伍’ 微软面试题:1——100000(十万)之间的数字有多少个9(注:99是两个9)Int整数,不包含带小数点的。
输出结果
1-100000之间,9出现的个数为50000
算法思路:
(1)先将1-n 的整数全部转化为 n 个字符串。
(2)统计每个字符串中,字符串"9"出现的个数;累计即可。
‘陆’ 面试时很紧张,脑子里一片空白,都不知要说什么好了
看一下他们怎么用人,你要根据他们的方法调整一下你自己就可以了
.1 最重要的雇佣标准
Fog Creek公司最重要的雇佣标准是:有头脑, 并且完成工作。
就是这些了。记住这条标准。我们公司的目标之一就是雇佣拥有这样潜质的人,而不是雇佣懂某些技术的人。任何人所拥有的某些具体技术都会在几年内过时,所以,雇佣有能力学习新技术的人,要比雇佣那些只在这一分钟知道SQL编程是怎么回事的人对公司更划算。
杂志首页 — 业界动态
|
焦点
|
人物
|
热点技术
|
开发实战
|
项目管理
|
工程应用
|
GIS人才
轻松面试 搞定技术奇才
如何做一名出色的面试经理
有头脑确实是一个很难定义的品质。但通过面试时提问的一些问题,就可以找出拥有这种品质的人。完成工作非常关键。看起来有头脑但是不能完成工作的人经常拥有博士学位,在大公司工作过,比起准时交货,他们宁愿对于一些学院派的东西沉思。这些人由以下特性可以识别出来。他们总是爱指出两个根本不同的概念间的相似性。例如,他们会说“Spreadsheets是一种特殊的编程语言”,然后花一个礼拜写一篇动人的、智慧的白皮书。这篇白皮书论述了作为一种编程语言,spreadsheet关于计算语言特性的方方面面。他们聪明,但是没用。
下面,我们来看完成工作但是没有头脑的人。他们爱做蠢事。通过制造新的工作,他们成为了公司的负债而不是资产。因为他们不仅没有为公司贡献价值,还浪费了好多人的时间。这些人通常到处粘贴大堆的代码,而不愿意写子程序。他们是完成了工作,但不是以最聪明的方式完成工作。
面试时最重要的法则
面试时最重要的法则是: 做决定。
面试结束时,对于被面试者,你不得不做一个直截了当的决定。这个决定只有两个:雇佣或者不雇佣。
没有其他的答案。永远不要说,“雇佣你,但不是在我的团队中”。这是非常粗鲁的,所以就尽可简单的把这句话变成“不雇佣”。如果某个人在特定领域很能干,但在别的队伍中表现不好,答案也是不雇佣。某些情况下你发现了一个拥有某些特殊能力的白痴专家,他对于SQL非常、非常的精通,但除此之外什么也不会,答案还是:不雇佣。在Fog Creek公司,他们没有将来。
永远不要说,“也许,我吃不准”。如果你不能做出决定,那也意味着不雇佣。最重要的是记住这点:宁可错失一千,不可放过一个。一个不合格的求职者如果进了公司,将消耗公司大量的金钱和精力。还要浪费其他优秀员工的时间来修复这个人的错误。总之,无论寻找合适的应聘者有多么困难,也永远不要降低你的标准。
如何作出雇佣或者不雇佣这样艰难的决定?答案只有一个:这个人有头脑吗?这个人能完成工作吗?要想做到正确的判断,面试时你必须问对问题。
开个玩笑,下面我要问个有史以来最差的面试问题:“Oracle 8i中的数据类型varchar和varchar2有什么区别”?这是一个可怕的问题。掌握这种琐碎的技术细节和Fog Creek公司想雇佣你之间没有任何联系。谁会去记这种东西?如果有在线帮助,你可以在15秒内找到答案。实际上,还有更差的问题,等会我们会谈到。
面试时应提哪些问题
现在我们要谈到有趣的部分了:面试时提哪些问题。我的面试问题清单来自于我去微软公司找第一份工作的经历。这里实际上有几百个微软面试问题。每个人都有偏爱的问题。你也可以发展一套自己的面试问题以及面试的个人风格,这样就可以比较容易地做出雇佣/不雇佣的决定。以下是我成功使用过的一些面试技巧。
面试前,读一遍应试者的简历,然后在一张纸片上写下面试计划。这个计划实际上就是问题清单。以下是一个例子(用来面试程序员的):
1. 介绍 2. 应试者参加过的项目
3. 不可能的问题 4. C语言函数
5. 你满意吗? 6. 设计问题
7. 挑战 8. 你还有什么问题?
面试前,我会非常当心,避免自己先入为主。面试就像一个非常精巧的天平。一小时的面试结束后就要对一个人下结论是不容易的(但是你又必须在面试结束后得到结论)。一些不起眼的细节可能会影响最后的结论。所以,如果你在面试前就对应试者作一点了解,就好比天平的某一端加重了砝码。这样面试本身就会失去原有的价值。
记得有一次面试前,一位猎头公司的人跑进房间说,“你会喜欢这个家伙的”。当这个家伙开始说蠢话时,我对自己说,“他应该是个例外,也许是大智若愚。”于是,我带着玫瑰色眼镜看他,并最终以“雇佣”结束了面试,虽然他是一个糟糕的员工。这次面试对我的教训是,不要听别人的话,不要在面试前四处打探这个应试者的情况。最重要的是不要和别的主考官谈论应试者,除非你们都已经做出了独立的判断。这是科学。
1.3.1 介绍
作为面试的第一步,介绍的目的是让应试者放松。我通常花30秒钟,讲一下我是谁,接下来面试会如何进行。我总是使应试者确信,我们关心的是他如何解决问题的,而不是他的最终答案是对还是错。顺便说一下,面试时,你不要和应试者隔桌而坐,否则你们间就有了一个障碍,并且暗示着一种比较正式严肃的气氛,这样应试者就很难放松了。较好的办法是把桌子靠墙,或者和应试者坐在桌子的同一边,这样有助于应试者放松。只有应试者不因为紧张而表现失常,你才能更有效的进行面试。
1.3.2 应试者参加过的项目
第二步就是了解应试者最近做了什么项目。对于那些刚离开校门的学生娃,就问他与学位论文相关的项目,或者问一下他们最喜欢的课程。例如,有时候我会问,“你最喜欢上学期哪门课程?不一定要和计算机相关。”这时你发现这名应届生档案中选修与音乐相关的课程远远大于计算机课程,但他却回答最喜欢的是《面向对象数据库》。实际上,如果他承认喜欢音乐胜过计算机,我会更高兴。当面试有工作经验的人员时,可以让他们谈谈前一份工作。
问这个问题的目的是寻找一种品质:热情。在应试者谈到他最近做过的项目时,如果能观察到以下迹象,那都是很不错的:
谈到他们做过的项目时变得热情洋溢;语速更快,语言更生动活泼。这说明他们对某些东西有兴趣,有热情。即使他们激动地表达对做过项目的负面感情,这也是一个好的信号。“我曾经为前一个老板安装Foo Bar Mark II,但他是个傻瓜!”表现出热情的人就是我们要雇佣的人。差的应试者对工作不关心,所以根本不会激动。一个非常好的信号是当应试者很激动地谈论上一份工作,以至于暂时忘记了他们正在被面试。有时候应试者刚开始面试时表现得很紧张,通常我会忽略不计,但是当他们谈到Computational Monochromatic Art时,激动的以至于忘记拘谨。不错,我喜欢这样的应试者,因为他们关心自己所做的事。
他们非常小心地解释事物。我曾经拒绝了一些应试者,因为在谈到他们做过的项目时,满口都是普通人不能理解的术语。如果应试者开始满口行话了,告诉他,“能帮个忙吗?你能把刚才所说的用我祖母也能理解的语言再讲一遍吗?”这时会有许多应试者还是使用术语,没有人能够理解他们在说什么。天哪!
如果所做项目是一个团队项目,看看他们是否有承担领导责任的迹象?一个应试者可能会说:“我们用X方法,但老板说Y方法,而客户要求用Z。”我会问,“那你是怎么做的?”一个好的答案可能是“我设法和团队中其他人开会,然后一起商量出办法……”坏的回答是,“嗯,我没办法,这样的问题我解决不了”。记住,聪明并且能完成工作。要搞清楚某人是否能完成工作的一个办法就是看他过去是否倾向于完成任务。事实上,你可以主动要求他们给你例子,证明他们能担任领导角色,完成任务——例如克服公司的陈规陋习等。
1.3.3 面试时无法回答的问题
现在谈谈清单上的第三款,无法回答的问题。这很有趣。这个主意的关键在于问一些不可能有答案的问题,就是想看一下应试者怎么办,如“西雅图有多少眼科医生?”“华盛顿纪念碑有多重?”“洛杉机有多少加油站?”“纽约有多少钢琴调音师”等等。
聪明的应试者猜到你不是在测验他们的专业知识,他们会积极地给出一个估计。“嗯,洛杉机的人口是七百万;每个人平均拥有2.5辆轿车…….”如果他们的估计完全错了也没有关系。重要的是他们能积极地试着回答问题。他们可能会试着搞清楚每个加油站的储量。“嗯,需要4分钟给一个储油罐加满油,一个加油站有10个油泵每天运行18个小时……”他们也可能试着从占地面积来估计。有时候他们的创造力会使你吃惊,因为他们问你要洛杉机的的黄页。这都是好迹象。
不聪明的应试者则被难住了。他们目瞪口呆地望着你,好像你来自火星。你不得不提示:“如果想建一个象洛杉机那么大的城市,你需要多少个加油站?”你还可以提示他们:“加满一个储油罐要多长时间?”但是不聪明的应试者还是傻傻地坐在哪里,等着你继续提示下去,直到你自己解答了问题。这些人不是问题的解决者,我们不想和他们一起工作。
1.3.4 编程问题
关于编程问题,我通常要求应试者用C语言写一些小函数。以下是我通常会出的题目:
1将一个字符串逆序
2将一个链表(linked list)逆序
3计算一个字节(byte)里有多少bit被置1
4搜索给定的字节(byte)
5在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的
6字符串转换成整数
7整数转换成字符串(这个问题很不错,因为应试者要用到堆栈或者strrev函数)
注意,通常你不会希望他们写的代码多于5行,因为你没有时间理解太长的代码。
现在我们来看一下这些问题的详细内容:
第一个问题:逆序一个字符串。至今为止,每一个应试者第一次解答这道题目时都答错了。所有的应试者都试图动态生成缓冲区,然后将逆序的字符串输出到该缓冲区中。问题的关键在于,谁负责生成这个缓冲区?谁又负责释放那个缓冲区?通过这个问题,我发现了一个有趣的事实,就是大多数认为自己懂C的人实际上不理解指针和内存的概念。这真叫人吃惊,他们不懂这个基本概念却可以做程序员?这个问题可以从多个角度判断应试者:
他们的函数运行快吗?看一下他们多少次调用了strlen函数。我曾经看到应试者写的strrev的算法竟然只有O(n^2) 的效率,而标准的算法效率应该是O(n),效率如此低下的原因是因为他们在循环中一次又一次地调用strlen函数。
他们使用指针运算吗(译者按:原文为pointer arithmetic,指的是加减指针变量的值)?这是一个好现象。许多所谓的“C程序员”竟然不知道如何使用指针运算。当然,我在前文说过我不会因为应试者不掌握一种特定的技巧而拒绝他。但是,理解C语言中的指针不是一种技巧,而是一种品质。每年一所大学要招进200多个计算机系的新生,所有这些孩子很小时就开始用BASIC语言在Atari 800s写冒险游戏了。在大学里他们还学Pascal语言,学得也很棒。直到有一天他们的教授开始教C语言,突然,他们开始搞不懂了。他们就是不能再理解C语言中的任何东西了。于是90%的计算机系学生转系去学政治。为了挽回面子,他们告诉朋友,之所以转系是因为他们计算机系英俊貌美的异性太少。许多人注定脑子里就没有理解指针的那根弦。所以说理解指针是一种与生俱来的品质,而不是一种单纯的技巧。理解指针需要脑子转好几个弯,某些人天生不擅长转这几个弯。
通过第三个问题,你可以观察到他们对于bit操作运算符掌握得怎么样?但是这是一种技巧,不是一种品质,所以你可以帮助他们。有趣的是你观察他们建立了一个子函数用来计算byte中为1的位的数目,然后你要求他们优化这个子函数,大大加快这个函数的运行速度。真正聪明的应试者会使用查表算法(毕竟这个表只有256个元素,用不了多少内存),整个表只需要建立一次。你还可以和这个聪明的应试者讨论一下如何权衡算法的效率和算法占用的内存。更深入一点:告诉他们你不想在程序启动时初始化查询表。厉害的程序员会建议第一次计数时使用普通算法,同时将查询结果缓冲到查询表中。某些天才程序员在计算那个查询表时,甚至试图使用已经使用过的模式。
当你观察应试者写C代码时,以下技巧会有所帮助:
事先向应试者说明。这完全理解,没有一个好的编辑器只在纸上写代码是困难的,所以你不在乎他们手写的代码是否看上去整洁。你也完全明白没有好的编译器和调试器,很难第一次就写出完全没有bug的程序,所以请他们不必为此担心。
优秀程序员的标志:优秀程序员写完“{”符号后,通常立刻跟上“}”符号,然后再在当中填上代码。他们也倾向于使用命名规则,虽然这个规则可能很原始。如果一个变量用作循环语句的索引,优秀的程序员通常使用尽可能少的字符为它命名。如果他们循环语句的索引变量的名字是,显而易见他们写代码的经验还不够多。偶尔,你会看到一个C程序员写下象if (0==strlen(x))一样的代码,常量被放在==的左边。这是一个好的标志。说明程序员理解了在C中=和==易于混淆。
优秀程序员在写代码前会订一个计划,特别是当他们的代码用到了指针时。例如,如果你要求逆序一个链表,优秀程序员通常会在纸的一边画上链表的草图,并表明算法中的索引指针当前移动到的位置。他们不得不这样做。正常人是不可能不借助草图就开始写一个逆序链表的程序的。而低水平的程序员则立刻开始写代码。
1.3.5 你对代码满意吗?
不可避免的,你会在他们的程序中发现bug,下面我们来看第五个问题:你对代码满意吗?你可能想问,“好吧,bug在哪里?”这是很糟糕但又一针见血的问题,要回答这个问题可要大费口舌。所有的程序员都会犯错误,这是真理。程序员必须找出这些错误。对于字符串操作的函数,他们通常会忘记在输出缓冲区加上字符串结束符。所有的函数,他们都会犯off-by-one错误(译者按:指的是某个变量的最大值和最小值可能会和正常值差1)。他们会忘掉正常的C语句结尾的分号。如果输入是零长度字符串,他们的函数会运行错误。如果malloc调用失败而他们没有为此写好错误处理代码,程序会崩溃。很少见的,一个程序员第一次写完的代码就完全没有错误。这时你可以问一个更有趣的问题,你说,“代码里有一个bug”。他们会再仔细地复查一遍代码,然后你就可以饶有兴趣地观察他们是否礼貌但是坚定地坚持自己的代码是否是完美的……总之,在程序员写完代码后,问一下他们是否对代码满意,就像美国ABC电视网游戏节目主持人Regis常问的那样“这是你最后的答案吗?”
1.3.6 设计问题
第六部分:关于设计的问题。让应试者设计某种东西。Excel的原始设计者Jabe Blumenthal喜欢让应试者设计房子。Jabe说,曾经有一个应试者跑到白板前,画了一个方块,这就是他的全部设计。立刻拒绝这样的家伙。再想一想你喜欢问什么样的设计问题呢?
好的程序员会问更多的信息。房子为谁建造?我们公司的政策是,我们不会雇佣那些在设计前不问为谁设计的人。通常,我会很烦恼地打断他们的设计描述,提醒他们“事实上,你忘记问这个房子是为谁设计的了。这个房子是给一群长颈鹿造的。”
愚笨的应试者认为设计就像画画,你想画什么就画什么。聪明的应试者明白设计的过程是一系列艰难的权衡。一个很棒的设计问题是:设计一个放在街角的垃圾箱。想一想你得做多少权衡!垃圾箱必须易于清空,但是很难被偷走;易于放进垃圾,但是碰到狂风大作,里面的垃圾不会被吹出来;垃圾箱必须坚固而便宜。在某些城市,垃圾箱必须特别设计,以防恐怖分子在里面隐藏定时炸弹。
有创造力的应试者会给出有趣而独特的设计。我最喜欢的问题之一是为盲人设计一个放调味品的架子。通常许多应试者的建议是把布莱叶文(一种盲人使用的文字)刻在放调料的罐子上,但这样文字会卷起来而变形。我碰到一个应试者,他的设计是把调料放在抽屉里,因为他觉得水平地感知布莱叶文比垂直地更方便。这个答案有创意,使我震惊!我面试了近乎一打的程序员,但从来没有人想到过类似的答案。这样有创意的答案确实跃过了普通人考虑问题的条条框框。仅仅因为这个答案太有创意了,而且应试者别的方面还过得去,我雇佣了这个应试者,他现在已经成为微软Excel团队中一个优秀的项目经理了。
总是争取一个确定的结果。这也是完成工作的特质的一部分。有时候应试者的思路飘忽不定,不能作出一个决定。有时候他们回避困难的问题,想蒙混过关。这很不好。好的应试者有一种推动事情自然前进的倾向,即使你有意把他们拖回来。如果关于某个话题的讨论开始原地打转变得没有意义了,好的应试者会说,“嗯,我们可以整天谈论这个,但是我们得做点什么。为什么我们不开始……”
1.3.7 挑战
问题转到第七部分,挑战。在整个面试过程中,你期望理想的应试者总是能够正确地评论某件事。这时你会说“等一会”,然后玩一种叫魔鬼代言人的游戏。你明知他们是对的,但你偏说不对。
软弱的应试者会屈服。那我就和他说拜拜了。
坚定的应试者会找到办法说服你。甚至他们会以肯尼迪总统的口才来说服你,“也许我误会了你的意思,”他们这样开头,但是正文仍是坚定地站稳立场。这样的人值得雇佣。
不得不承认,面试双方的地位并不完全平等。有时应试者由于害怕你的权力而不敢与你争辩。但是,好的应试者有足够的热情和勇气坚持正确的观点,他们由于热切希望说服你而会暂时忘记正在被面试。这样的人正是我们要找的人。
1.3.8 你还有什么问题
最后,可以询问应试者有什么想了解的。一些人喜欢看看应试者这时是否会问一些聪明的问题。这是市面上流行的面试书籍的标准技巧。我个人不在乎应试者问什么,因为这时我已经做好了决定。这一步的困难之处在于,应试者也许已经见过了5、6个人,进行了好几轮面试,他们可能很疲倦,以至于不能为每轮面试都准备一个聪明而独特的问题。所以如果他们没有什么可问的,这也没关系。
我总是留下面试的最后5分钟来推销我们公司。这很重要。即使我不打算雇佣眼前这位应试者,我也会如此。原因在于如果你幸运的找到一位很满意的应试者,你当然愿意做任何事情说服他(她)来你的公司。如果他们不是很好的应试者,你也要尽力让他们为Fog Creek公司心动,这样面试结束时他们会对Fog Creek公司留下很好的印象。记住,应试者并不仅仅是可能的雇员,他们也是顾客,也是我们公司的推销员。如果他们觉得我们的公司很棒,他们也许会推荐朋友来面试。
1.2 几个糟糕的面试问题的范例
啊哈,下面我要举出几个糟糕的面试问题的范例。
首先,避免不合法的问题。有关种族、宗教、性别、出生国、年龄、服役记录、是否老兵、性取向、生理障碍的问题都是不合法的。即使他们的简历说他们1990年在军中服役,也不要问有关问题。即便他们会愉快地谈论在海湾战争中的经历,但你的问题还是不合法的。
其次,不要在问题中给应试者以暗示,我们公司喜欢或者不喜欢什么样的员工。我能想到的一个例子是问应试者是否有小孩或者是否结婚了。这个问题也许会让应试者认为我们不喜欢有家庭拖累的员工。
最后,不要问那些脑筋急转弯的题目,例如6根火柴怎么拼出4个三角形。像这样灵机一动的问题是不能看出应试者是否具备“有头脑/完成工作”的品质的。
面试与其说是科学,不如说是艺术。但是只要你记住有头脑/完成工作这个原则,你就可以应对自如。有机会问问你的同事,看他们喜欢什么样的面试问题和答案。这本来就是我们公司员工午饭时热衷的话题之一啊。
‘柒’ 大公司笔试面试有哪些经典算法题目
1、二维数组中的查找
具体例题:如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。现在给出一个数字序列,允许使用一种转换操作:选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列?
‘捌’ 计算机面试主考官一般都会问到什么问题
《编程之美——微软技术面试心得》里面有60多道面试题目,很多IT公司的算法或者程序设计题目都跟它类似,而且里面每个题目都给出了好几种解法,还有扩展问题。
不知道符不符合你的要求。