`
mmdev
  • 浏览: 12935102 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

面试问题汇总 精选 分析 解答 职业规划 part 2

 
阅读更多

面试困惑问与答(2)——感觉挺好,为啥被拒了?

问:技术面试的时候,题目挺简单的,我觉得自己都做出来了。可最后怎么还是被拒了啊?

答:面试被拒有很多种可能,比如面试官认为你性格不适合、态度不够诚恳等等。但在技术面试过程中,这些都不是最重要的。技术面试的面试官一般都是程序员,程序员通常没有那么多花花肠子,他们只认一个理:题目做对、做完整了,就让你通过面试;否则就没戏。所以碰到简单题目却被拒的情况,应聘者还是要检讨题目是不是真的做对、做完整了。

举一个微软面试开发工程师时最常用的一个问题为例:把一个字符串转换成整数。这个题目很简单吧?很多人都能在三分钟之类写出如下不到十行的代码:

int StrToInt(char* string)

{

int number = 0;

while(*string != 0)

{

number = number * 10 + *string - '0';

++string;

}

return number;

}

看了上面的代码,你是不是觉得微软很容易搞定?如果你真的这么想,不好意思,你可能又要被拒了。

通常越是简单的问题,面试官的期望值就会越高。当题目简单的时候,面试官就会期待应聘者能够很完整解决问题,除了完成基本功能之外,能够考虑各种边界条件、错误处理等各个方面。像这道题,面试官不仅仅只是期待你能完成把字符串转换成整数这个最最起码的要求,而是希望你能考虑到各种特殊的输入。如果我是面试官,我至少会期待应聘者能够在不需要提示的情况下,考虑到输入的字符串中有非数字字符和正负号,要考虑到最大的正整数和最小的负整数,以及溢出,同时还要考虑当输入的字符串不能转换成整数时,应该如何做错误处理。当把这个问题的方方面面都考虑到的时候,你也就不会再认为这道题简单了。

除了问题考虑不全面之外,还有一个面试官不能容忍的错误就是程序不够鲁棒。以前面的那段代码为例,只要输入一个空指针,程序立即崩溃。这样的代码如果加入到软件当中,将是灾难。因此当面试官看到代码中对空指针没有判断并加以特殊处理的时候,通常他连往下看的兴趣都没有。

当然,不是所有与鲁棒性相关的问题都和前面的代码那样明显。再举一个很多人都被面试过的问题:求链表中的倒数第k个结点。有不少人先在网上看过这个题目,因此知道思路是用两个指针,第一个指针先走k-1步,然后两个指针一起走。当第一个指针走到尾结点的时候,第二个指针指向的就是倒数第k个结点。于是他大笔一挥,写下了下面的代码:

ListNode* FindKthToTail(ListNode* pListHead,unsigned int k)

{

if(pListHead == NULL || k == 0)

return NULL;

ListNode *pAhead = pListHead;

ListNode *pBehind = NULL;

for(unsignedint i = 0; i < k - 1; ++ i)

{

pAhead = pAhead->m_pNext;

}

pBehind = pListHead;

while(pAhead->m_pNext != NULL)

{

pAhead = pAhead->m_pNext;

pBehind = pBehind->m_pNext;

}

return pBehind;

}

写完之后,应聘者看到自己已经判断了输入的指针是不是空指针并做了特殊处理,于是心里洋洋得意以为这次面试必定顺利通过了。可是,他没有想到的是这段代码中仍然有很严重的问题:当链表中的结点总数小于k的时候,程序还是会崩溃。因此,几天之后他收到的仍然不会是Offer,而是拒信。

要想很好地解决前面的问题,最好的办法是在动手写代码之后想好测试用例。只有把各种可能的输入事先都想好了,才能在写代码的时候把各种情况都做相应的处理。写完代码之后,也不要立刻给面试官检查,而是先在心里默默地运行。当程序运行之前想好的所有测试用例都能得到合理的输出时,再把代码交给面试官。做到了这一步,通过面试拿到Offer就是水到渠成的事情了。

博主何海涛对本博客文章享有版权。网络转载请注明出处http://blog.csdn.net/cadcisdhht。整理出版物请和作者联系。有任何建议或意见,欢迎在评论中告知,或者加我微博http://weibo.com/zhedahht与我交流。



面试困惑问与答(3)——题目没弄懂,可以问面试官吗?

问:面试的时候,面试官突然冒出一个之前没有听过的概念,请问我可以问面试官让他把题目说清楚吗?如果问的话他会不会觉得我很傻?

答:面试和笔试最大的区别是:面试是一个注重沟通交流的过程,而且沟通是双向的。因此面试官可以问应聘者问题,同样应聘者也可以问面试官问题。

通常在面试环节面试官的一个很重要的任务就是考察应聘者的学习愿望以及学习能力。学习能力怎么体现呢?面试官提出一个新概念,应聘者没有听说他,于是他在已有的理解的基础上问进一步的问题,然后掌握了这个概念。这就是学习能力。通常学习能力强的人具有主动积极的态度。因此建议在应聘过程中碰到不明白的地方多提问,这样面试官觉得你态度积极,求知欲望强烈,这样会给面试结果加分。

举个例子,google曾经有一道面试题:找出第1500个丑数。很多人都不知道丑数是什么。不知道怎么办?面试官就坐在对面,可以问他啊。面试官会告诉你只含有2、3、5三个因子的数就是丑数。你听了后,觉得听明白了,但不太确定,于是可以举几个例子并让面试确认你的理解是不是对的: 6、8、 10、12都是丑数,但14就不是,对吗?当面试官给出肯定的答复,你就知道自己的理解是对的了。问题问的是第1500个丑数,与顺序有关。可是哪个数字时第一个丑数呢,1是不是第一个?这个你可能也不能确定,怎么办?还是问面试官,他会告诉你1是或者不是丑数。题目是他出的,他有责任把题目给你解释清楚。

有些面试官甚至故意一开始不把题目描述的清楚,让题目存在一定的二义性。他期待应聘者能够一步步通过提问来弄明白题目的要求。这就是在考察应聘者的沟通能力。为什么要这样考察?因为实际工作也是这样,不是一开始项目需求就定义得很清楚了。程序员需要多次与项目经理甚至客户反复沟通才能把需求弄清楚。如果没有一定的沟通能力,当程序员面对一个模糊的客户需求时,他就会觉得无处下手。

比如最近很流行的一个面试题,面试官最开始问:如何求树中两个结点的最近公共父结点。此时面试官对题目中的树的特点完全没有给出描述。他希望应聘者在听到问题后会提出几个问题,比如这棵树是二叉树还是普通的树。

如果面试官说是二叉树,应聘者可以继续问该树是不是排序的二叉树。面试官回答是排序的。听到这里,应聘者才能确定思路:从书的根结点出发遍历树,如果当前结点都大于输入的两个结点,则下一步遍历当前结点的左子树;如果当前结点小于输入的两个结点,则下一步遍历当前结点右子树。一直遍历到当前结点比一个输入结点大而比另一个小的时候,此时当前结点就是符合要求的最近公共父结点。

如果应聘者问树是不是二叉树的时候,面试官回答是任意的树。此时应聘者可以接着提问在树结点中有没有指向父结点的指针,面试官将会给出肯定的回答。由于树的结点中有指向父结点的指针,因此从输入的结点出发,沿着指向父结点的指针一直到树的根结点,可以看做是一个链表,因此这个题目的解法就和求两个链表的第一个公共结点的解法是一样的了。

我们可以看出面试官给出不同的条件,将是两个两个完全不一样的题目。如果一开始应聘者没有弄清楚面试官的意图就贸然动手解题,那结果很有可能是离题千里。从中我们也可以看出在面试过程中沟通的重要性,当觉得题目的条件、要求不够明确的时候,一定要多提问来消除自己的疑惑。

博主何海涛对本博客文章享有版权。网络转载请注明出处http://blog.csdn.net/cadcisdhht。整理出版物请和作者联系。有任何建议或意见,欢迎在评论中告知,或者加我微博http://weibo.com/zhedahht与我交流。


面试困惑问与答(4)——最后该问什么?

问:每次面试的时候,面试官都会问我有没有什么问题要问他。我可以问什么问题呢?

答:面试官让应聘者问问题,主要是想了解应聘者最关心的问题有哪些。因此,首先至少要问一两个问题。不然面试官就会觉得你对我们公司、职位等都不感兴趣,那你来面试做什么?但是也不是什么问题都可以在这个时候问。如果问题问得比较合适,对应聘者来说是个加分的好机会;但如果问的问题不太合适,面试官对你的印象就会大打折扣,相当于跳入面试官的陷阱了。

先谈谈不适合问的问题。首先是问和自己的职位没有关系的问题,比如问“公司未来五年的发展战略是什么”。如果你面试的职位是CTO,而你的面试官是CEO,这倒是个合适的问题。如果面试的职位只是个程序员,那这个问题离你就太远了,与你的切身利益没有多少关系。再说,坐在你对面的面试官很有可能也只是个程序员,你让他怎么回答这个关系公司发展战略的问题呢?

其次是问薪水。技术面试不是谈薪水的时候。要谈工资,等通过面试之后和HR谈。这个问题在前面的第一个困惑中已经讲过,不在赘述。

第三是立即打听面试结果,比如问“您觉得我能拿到Offer吗”之类的问题。现在大部分公司的面试都有好几轮,最终决定应聘者能不能通过面试,是要把所有面试官的评价综合起来的。问这个问题相当于白问,因为问了面试官也不可能告诉你结果。

笔者推荐问的问题是与招聘的职位或者项目相关的问题。如果这种类型的问题问得很到位,那么面试官就会觉得你对应聘的职位很有兴趣。不过要问好这种类型的问题也不容易,因为首先对应聘的职位或者项目的背景要有一定的了解。我们可以从两方面去了解相关的信息。一是面试前做足功课,到网上去搜集一些相关的信息,做到对公司成立时间、主要业务、职位要求等都了然于胸。二是面试过程中注意面试官说过的话。有不少的面试官在面试之前会对招聘的职位相关的项目会做简单介绍,其中会包含其他渠道无法得到的信息,比如项目进展情况等等。应聘者可以从中找出一两个点,然后向面试官问。

举几个我当时来思科面试的时候问的几个问题。一个面试官介绍项目时说这次招聘是项目组第一次在中国招人,目前这个项目所有人员都在美国总部。那一轮我最后问的问题是:这个项目所有的老员工都在美国,那怎么对中国这一批新员工进行培训?中国的新员工有没有机会去美国总部学习?最后一轮面试是老板面试,她介绍我要加入的项目组是负责开发思科测试供应商生产出来的网络设备的测试系统。当时我最后问的几个问题是:这个组是做测试系统的,那这个组的人员是不是也要参与网络设备的测试,是不是需要学习硬件测试相关的知识?因为我们测试的对象是网络设备,那么这个职位对网络硬件的掌握程度有没有要求?

博主何海涛对本博客文章享有版权。网络转载请注明出处http://blog.csdn.net/cadcisdhht。整理出版物请和作者联系。有任何建议或意见,欢迎在评论中告知,或者加我微博http://weibo.com/zhedahht与我交流。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics