问:技术面试的时候,题目挺简单的,我觉得自己都做出来了。可最后怎么还是被拒了啊?
答:面试被拒有很多种可能,比如面试官认为你性格不适合、态度不够诚恳等等。但在技术面试过程中,这些都不是最重要的。技术面试的面试官一般都是程序员,程序员通常没有那么多花花肠子,他们只认一个理:题目做对、做完整了,就让你通过面试;否则就没戏。所以碰到简单题目却被拒的情况,应聘者还是要检讨题目是不是真的做对、做完整了。
举一个微软面试开发工程师时最常用的一个问题为例:把一个字符串转换成整数。这个题目很简单吧?很多人都能在三分钟之类写出如下不到十行的代码:
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(unsigned int 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/article/details/6197041