前面我们了解了和不同角色的人物见面的面试技巧,下面再说说程序员们更加频繁遇到的一个考核方式“笔试”。
“笔试”对于初级程序员应聘者来说是一个关键一关,也是刷掉的可能性最大的一关,一次面试中大部分程序员都会由于“笔试”没有过而无缘进入下一个阶段,只有少数程序员得到与主考官见面的机会。
作为即将应聘初级程序员的我们,更应该做好技术的准备工作,这部分工作恐怕要花费比较多的时间去准备。
如何准备?
还是那句话至少应该读完本书,因为除了“技巧”之外,“技能”更重要。
1.2.3.1 笔试目的
(2) 考察掌握知识的扎实程度,及面对问题的思考方式。
1.2.3.2 笔试误区,这些情况在笔试时应避免
也许你认为这道题很难,其他竞争对手也会觉得很难。
(2) 没有看清题匆忙作答
这不是入学考试,如果没有人给你计时间,你不用那么匆忙,正常速度作答即可。
(3) 不能完整作答的,干脆就空白
这和我们在学校考试不一样,如果你不能回答完整,最好也写上思路,或者写上想和主考官说的话,有的时候他也会给你机会的呦。
(4) 不清楚的一些概念性的问题,用其他同样不太清楚的概念“生搬硬套”
有些概念本来就不太清楚,就别拿另一个你不清楚的问题往上“套”啦,这样做,往往让主考官哭笑不得,一下暴露原来这些概念都不清楚。
(5) 笔试没有60分及格线这么一说
应聘职位的“笔试”和我们在学校的“考试”完全不同,不存在“及格”与“不及格”的问题,也许你某一个道题回答的很精彩,但是总分并不是很理想也会被录用。
1.2.3.3 笔试技巧
我挑了几道笔试题,曾经给入职程序员出过的几个测试题,大家看看应该怎么作答,我们再看看需要注意什么,题目如下:
1.2.3.3.1 例题1:请说出这个程序的目的是什么?返回结果是什么?
try
{
String a="",b="";
InputStream ins = urla.openStream();
BufferedReader bReader = new BufferedReader(new InputStreamReader(ins));
String info = bReader.readLine();
int i=1;
info=bReader.readLine();
a=info.substring(0,info.indexOf("@"));
b=info.substring(info.indexOf("@")+1,info.length());
this.X1=Integer.parseInt(a);
this.Y1=Integer.parseInt(b);
}
this.X2=Integer.parseInt(a);
this.Y2=Integer.parseInt(b);
}
if (i==3){
this.X3=Integer.parseInt(a);
this.Y3=Integer.parseInt(b);
}
if (i==4){
this.X4=Integer.parseInt(a);
this.Y4=Integer.parseInt(b);
}
i++;
info=bReader.readLine();
}
}
catch(MalformedURLException e){
System.out.println(e);
}
catch(IOException e){
System.out.println(e);
}
}
该题解释:
第二问,返回值是什么?
第一问,这个程序的目的是什么?
这个程序乍一看确实不太明白,其实,这正是在考察应聘者的想象力和理解能力,这个程序一看就应该知道这是一个构造函数,这个构造函数里有四对变量分别是“X”和“Y”作为开头的,让人直接联想到坐标,另外这个构造函数的名字是Station,说明这个类的名字是Station,因此,可以想见,这个确实是这个Station的四个点的坐标,是用http协议到一个Web上去取得一个字符串,再去解出这个字符串中的每一个数字,赋值给相应的属性。
该函数是一个构造函数,他的目的是构造一个Station类,根据他的名字和属性判断,这个类有可能是描述一个物体的位置信息,这个信息可以解出四个变量分别赋值给不同的属性。疑问,感觉用substring 和indexOf的方法解析出数据比较麻烦,为什么本程序不用String的split方法呢?那会更省事点。另外这个程序是采用URL类的openStream()方法得到远端某一个网页上的数据,那网页可能是一个JSP,可以直接从数据库中取得数据,这个方法,省去了一个自建的Server程序,这种用法我是第一次看到,感觉学习到了一个新的应用方法的知识。
1.2.3.3.2 例题2:请写一段html,完成下列表格的样子。注意:是单线边框。
陷阱一:这道题初看起来很简单,似乎就是在考一个简单的“<table>”标记,于是有很多人都直接画出了一个table,至于单线边框的问题,他们总是用“border="1"”来描述table。
这样的话,画出来的图一定是这样的如图所示。
陷阱二:本题表格中的文字是大小写不同的,有的用的是小写,有的用的是大写,一定要按照要求回答问题,这主要考察的是按照要求完成任务的能力。
正确答案:
<tr>
<td bgcolor="#FFFFFF">A</td>
<td bgcolor="#FFFFFF">b</td>
<td bgcolor="#FFFFFF">C</td>
</tr>
<tr>
<td bgcolor="#FFFFFF">D</td>
<td bgcolor="#FFFFFF">e</td>
<td bgcolor="#FFFFFF">F</td>
</tr>
</table>
1.2.3.3.3 例题3:一个算法题
要求:有两个数组一个N个元素,另一个M个元素,这两个数组中有些元素是相同的,希望通过编写一段程序将两个数组中的相同元素找出来,请用最少的循环次数完成需求,请问需要用什么方法?
一般程序员马上会想到类似如下的程序:
for(int i=1;i<n;i++){
……
}
}
正确的答案是,用哈希表的方法,这个方法的循环次数是M+N,一个是将M装入哈希表的循环,一个是将N逐个放倒M哈希表中去查询的次数。
这道题有两个陷阱,第一个,“算法题”,一般有些程序员只要听到“算法”这个词,马上晕了,从而影响合理的思考。第二个陷阱是“最少”,用最少的循环次数的方法,而不是普通的,但就是这么两个陷阱使很多应聘程序员落马。
1.2.3.3.4 例题总结
清华大学出版社《Java程序员,上班那点事儿》作者:钟声