国外程序员面试经验
导读:面试准备的重要性不用编者多言,大家都很清楚。本文是加拿大的一位程序员所写。大家可以看看国外程序员是怎么准备面试。不管你是否认同他的说法,《诗经》中有句话非常好——“它山之石,可以攻玉”。如果你还有其他面试准备方法,不妨在评论或微博中和大家一起讨论分享。
一、开门见山
一般来说,你(求职者)在面试中会花很多时间谈论以前的经历。如果你还没有想出你的最具代表性的经历/案例,那么你现在是时候该做了。下面有张问题表,虽然很多问题看似比较低级,但相信我,看完这些问题后,你应当反思自己。即便面试时没有碰到类似这张列表上的问题,你在面试也可以用上已准备好的答案。
[wojiushiwo987注:以下是一些常识、目标题]
1. 说说你自己吧
2. 你的短期目标是什么?你2到5年内的目标是什么?
3. 你的愿景/使命是什么?
4. 你想从这个岗位中学到什么?
5. 你为什么认为自己能胜任这个岗位?
6. 除了这个岗位,你还在找哪些岗位?
7. 你有什么样的管理或领导经验?
8. 你有什么样的团队工作经验?
9. 你最满意/不满意的经历是什么?
10. 你的强项/弱项是什么?
11. 你最擅长处理哪一类的问题?
12. 你是如何减压?如何平衡工作和生活?
13. 如果他人提出的要求有违你的道德准则或商业道德,你怎么处理?
14. 你上次试图向他人出售点子有什么样的结果?
15. 你为什么要应聘我们公司?你对我们公司了解多少?
16. 你认为加入我们公司有什么样的利弊?
17. 你最看重雇主的哪一方面?
18. 你过去遇到的主管有哪些共同点?
19. 如果要在竞争中保持领先,你认为我们公司的员工最需要哪些品质?
20. 你最喜欢/不喜欢什么课程?为什么?
21. 你的兼职/暑假/实习经历中有什么收获?
22. 你有什么样的深造计划?
23. 为什么你的成绩这么低?
24. 你是如何打发空余时间的?
25. 如果我让你的朋友们描述你,你觉得他们会怎么说呢?
26. 什么事最让你沮丧?
27. 你上次在工作中遇到恼火的事是什么时候?结果如何?
28. 你如何提高你的整体效益?
29. 去年你遇到最艰难的决定是什么?为什么它很艰难?
30. 你为什么到现在还没有找到工作?
31. 你在哪些方面没有任何经验?比如:销售、筹款或者簿记。
32. 我们为什么要雇用你?
上面这个列表中的问题需要深思和反省才能回答,所以在下一次面试之前很有必要提前想一想。有些问题可以有相同的答案。如果问题答案需要讲述一段故事/经历,你可以按如下方式来做:
1. 20秒描述情况。“代码出问题了,整个团队必须找出原因。”
2. 30秒描述你做了什么。“我认为是内存溢出,我注意到Abstract Member Creation Factory本应该只有一个实例,但它有很多实例”。
3. 20秒描述结果。“我用一行代码解决溢出问题,我们的产品如期上线。后来,我都会先测试确保不会再有类似问题”。
在每次面试前,浏览整个列表并大声练习你的回答。这样做让你在面试中更加轻松自如,你就比其他应聘者有更多的优势。比如,当在回答问题时,其他应聘者可能会先看着天花板说“嗯”,然后开始回忆过去5年中发生的一切。而你则可以微笑地看着面试官的眼睛,再陈述你的答案。
二、事先练习最常用的编程算法,以建立自信
钢琴家在达到下一级水平之前,他们必须先学习一套短曲。这些短曲虽然不曾在聚会上弹奏,但他们要练习特定的部分,比如右手小指和切分音。同理,尽管有些算法你或许没有在你的代码中用过,但它们经常在编程面试中出现。比如:
1.反转单链表;
2.反转字符串或反转段落中的单词顺序;
3.利用星号输出画一个任意大小的圆;
4.整数转换为字符串,数字型的字符串转换为整数;
5.写一个函数,返回任意整数对应二进制形式中的“1”的个数;
6.写一个函数,输出字符串中字符的所有排序。(比如:abc acb bac bca cab cba)
一般来说,可以先不考虑算法的运行时间,都是先用最简单有效算法。然后再尽量减少运行时间。能让算法正常跑起来,总比你花大量时间想一步到位要好。(一步到位的想法虽好,但大部分时候都是事倍功半。)
提示:做练习时,别自欺欺人看答案。
我第一次写“反转单链表”算法是利用课间时间。我并不急,从运行时间较长的方案到优化的方案,我用了半个小时。在验证算法正确无误后,我非常高兴!我知道不看答案我也能解决问题了。(建立自信了!)在面试中,当遇到从未见过的问题时,我以前的经验给了我信心。
三、练习解决问题能力
有些应聘者认为能解决脑筋急转弯问题就有良好的编程技能。如果你也这么认为,那你应当培养猜谜这方面的兴趣和技巧。你可以去图书馆或在网上找这方面的书。然后,挑一些有趣的问题,先别看解答。如果半个小时之内还想不出答案的,才可以查阅解答。
第四、展现出真正的热情
另一个技巧就是要把真正的热情展现出来。作为人,我们应该真诚和热情与他人共处工作。另一方面,我们也要有看穿虚假笑脸的能力(没有这种能力,也需要锻炼出来),所以活出真我很重要。
最优秀的面试官会让你讨论一些你非常热衷的事情,即使有些些事和你所应聘的岗位没有直接关系。然而,大多数面试官却没有这么做。虽然如此,你还是应当好好考虑那些你非常感兴趣的事,并且要抓住机会来和面试官讨论一番。如果面试官允许的话,一定要在面试过程中的前段时间内完成,如果能在第一时间展现出来更佳。面试开始10分钟后的效果可能就不怎么样了,因为面试官已经给你打分了。
想象一下:你第一天去新岗位工作,转向新的开发平台,遇到一些有趣的新朋友,并且了解了公司的生活。(总之)在公司中会有很多让你兴奋的事,要不然,你为什么去应聘呢?
五、睡眠/休息
如果你缺觉的话,“舌尖现象”则会急剧上升,导致你在面试中就不能很好回忆事情。所以,面试前必须有个良好的睡眠。到底睡多长时间最合适呢?请参考此文《你的睡眠时间和睡眠质量达标了么?》。http://www.cdc.gov/sleep/how_much_sleep.htm
编者注:“舌尖现象”非常普遍,它是因为大脑对记忆内容的暂时性抑制所造成的。这种抑制来自于多方面,比如对有关事物的其他部分特征的回忆掩盖了所要回忆的那部分特征,又比如回忆时的情境因素以及自身情绪因素的干扰等等。而消除了抑制,(如经他人提示、离开回忆困难时的情境、消除紧张情绪等,)舌尖现象往往就会消失。很多人都有过这样的经历:一些平时很简单、很熟悉的字、单词或公式等话到嘴边就是无法记起,考试过后却突然忆起。再比如,遇到一个熟人,就是叫不出名字来。心理学上称这种特殊现象为记忆的“舌尖现象”,意思是回忆的内容到了舌尖,只差一点,就是无法忆起。
以上内容引自:http://www.jobbole.com/entry.php/253
附第2部分的6个简单问题的源程序:
1.反转单链表;
Node* reverseList(Node*pFirstNode) { //方法1.新建链表,然后逐个拷贝,第二个数据放置到第一个数的前面,即完成逆转. Node* pReverseList = new Node; if(!pFirstNode) {
pReverseList = NULL; return pReverseList; } if(!pFirstNode->link) { pReverseList->data = pFirstNode->data; pReverseList->link = NULL; return pReverseList; } pReverseList->data = 8888; //边界 pReverseList->link = NULL; while(pFirstNode) { Node* pNewNode = new Node; pNewNode->data = pFirstNode->data; pNewNode->link = pReverseList->link; pReverseList->link = pNewNode; pFirstNode = pFirstNode->link; } return pReverseList; }
如上图:方法2.
步骤:依次递归….
1)1-->3
2)2-->1
3) 0-->2
Node*reverseList2(Node* pFirstNode) { //方法2.就地逆置 if(!pFirstNode) { return NULL; } Node* p = new Node; Node* q = new Node; p = pFirstNode->link; int i = 0; while(p->link) { q = p->link; p->link = q->link; //1-->3 q->link = pFirstNode->link; //2-->1 pFirstNode->link = q; //0-->2 } return pFirstNode; }
2.反转字符串或反转段落中的单词顺序;
<pre class="cpp" name="code">#include "stdafx.h" #include <assert.h> #include<iostream> using namespace std; //反转字符串示例[源"wojiushiwo987",反转后"789owihsuijow"] char* reverseString(const char* strSrc) { assert(NULL != strSrc); int istrSrcLen = strlen(strSrc); char* strRest = new char[1 + istrSrcLen]; memset(strRest,0,1 + istrSrcLen); int iStrCnt = 0; while(istrSrcLen!= 0) { strRest[iStrCnt]= strSrc[istrSrcLen-1]; istrSrcLen--; iStrCnt++; } return strRest; } int main() { const char* strSrc = "wojiushiwo987"; char* strDest = reverseString(strSrc); cout << strDest << endl; if (NULL != strDest) { delete []strDest; strDest = NULL; } return 0; }
3.利用星号输出画一个任意大小的圆;[百度一下]
//1)如何画圆;2)如何用*画圆;3)
4.整数转换为字符串,数字型的字符串转换为整数;
//字符串转化为整形,2012 360春季招聘已考,以下是简洁版
//整形转化为字符串,各面试宝典中都有涉及,常考
//字符串转整形--简化atoi
int atoi_t(char* str) { int iRest = 0; //输出十进制结果... int istrLen = strlen(str); int itmp = 0; while(*str != '\0') { itmp = *str - '0'; iRest = iRest*10 + itmp; str++; } return iRest; } //整形转字符串--简化itoa【写的太复杂。。。】 char* itoa_t(int iVal) { char* strRest = new char[10]; memset(strRest,0,10); int quotient = 0; //商数 int reminder = 0; //余数 int iCnt = 0; int itmp = 0; while( 0 != iVal) //1234 { quotient = iVal/10; reminder = iVal%10; strRest[iCnt++] = reminder + '0'; iVal = quotient; } char* strRest2 = new char[iCnt]; memset(strRest2,0,iCnt); int i = 0; iCnt--; while(iCnt >= 0) { strRest2[i++] = strRest[iCnt--]; } strRest2[i] = '\0'; return strRest2; } intmain() { char* strData = "1234"; int iData = atoi_t(strData); cout << iData << endl; cout << itoa_t(iData) << endl; return 0; }
5.写一个函数,返回任意整数对应二进制形式中的“1”的个数;
//步骤,整形转化为二进制,转换的过程中记录“1”的个数…
int binaryOneCnt(intiDecNum) { int quotient; //商数 int remainder; //余数 int iBinary = 0; //生成的二进制数 int cnt = 0; int binCnt = 0; //二进制位个数... while(iDecNum != 0) { quotient =iDecNum/2; //4 remainder = iDecNum%2; //1 if(remainder == 1) { binCnt++; //判定 } iBinary += remainder*pow(10,cnt); iDecNum = quotient; cnt++; } return binCnt; } int main() { for( int i = 1; i <= 32; i++) { cout << binaryOneCnt(i) << "\t";//输出1-32二进制表示“1”的个数... } cout << endl; return 0; }
//编程之美简单算法
int numsof2(int ival) { int count = 0; while(ival != 0) { ival = ival&(ival-1); ++count; } return count; } int main() { cout << numsof2(255) << endl; //8 return 0; }
6.写一个函数,输出字符串中字符的所有排序。(比如:abc acb bac bca cab cba)
牵涉算法!