清华大学出版社《Java程序员,上班那点事儿》作者:钟声 章节:1.2.3:
        前面我们了解了和不同角色的人物见面的面试技巧,下面再说说程序员们更加频繁遇到的一个考核方式“笔试”。
        “笔试”对于初级程序员应聘者来说是一个关键一关,也是刷掉的可能性最大的一关,一次面试中大部分程序员都会由于“笔试”没有过而无缘进入下一个阶段,只有少数程序员得到与主考官见面的机会。
        作为即将应聘初级程序员的我们,更应该做好技术的准备工作,这部分工作恐怕要花费比较多的时间去准备。
        如何准备?
        还是那句话至少应该读完本书,因为除了“技巧”之外,“技能”更重要。

1.2.3.1 笔试目的
(1) 为防止没有实际开发经验和开发技能的人来面试,可以通过“笔试”过滤掉一批人;
(2) 考察掌握知识的扎实程度,及面对问题的思考方式。

1.2.3.2 笔试误区,这些情况在笔试时应避免
(1) 有一道题不会,就放弃了整个笔试
也许你认为这道题很难,其他竞争对手也会觉得很难。
(2) 没有看清题匆忙作答
这不是入学考试,如果没有人给你计时间,你不用那么匆忙,正常速度作答即可。
(3) 不能完整作答的,干脆就空白
这和我们在学校考试不一样,如果你不能回答完整,最好也写上思路,或者写上想和主考官说的话,有的时候他也会给你机会的呦。
(4) 不清楚的一些概念性的问题,用其他同样不太清楚的概念“生搬硬套”
有些概念本来就不太清楚,就别拿另一个你不清楚的问题往上“套”啦,这样做,往往让主考官哭笑不得,一下暴露原来这些概念都不清楚。
(5) 笔试没有60分及格线这么一说
应聘职位的“笔试”和我们在学校的“考试”完全不同,不存在“及格”与“不及格”的问题,也许你某一个道题回答的很精彩,但是总分并不是很理想也会被录用。

1.2.3.3 笔试技巧

我挑了几道笔试题,曾经给入职程序员出过的几个测试题,大家看看应该怎么作答,我们再看看需要注意什么,题目如下:

1.2.3.3.1 例题1:请说出这个程序的目的是什么?返回结果是什么?
 
public Station(URL urla){
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();
  
    while(info!=null){
          a=info.substring(0,info.indexOf("@"));
          b=info.substring(info.indexOf("@")+1,info.length());
 
          if (i==1){
             this.X1=Integer.parseInt(a);
             this.Y1=Integer.parseInt(b);
         }
       
         if (i==2){
             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);
   }
}

该题解释:
第二问,返回值是什么?
总有人直接回答,说“没有返回值”,这说明没有弄明白构造函数的声明,如果是普通函数没有返回值的话,应该用“void”而不是没有写任何东西。

第一问,这个程序的目的是什么?
这个程序乍一看确实不太明白,其实,这正是在考察应聘者的想象力和理解能力,这个程序一看就应该知道这是一个构造函数,这个构造函数里有四对变量分别是“X”和“Y”作为开头的,让人直接联想到坐标,另外这个构造函数的名字是Station,说明这个类的名字是Station,因此,可以想见,这个确实是这个Station的四个点的坐标,是用http协议到一个Web上去取得一个字符串,再去解出这个字符串中的每一个数字,赋值给相应的属性。
 
某君的比较精彩回答:
该函数是一个构造函数,他的目的是构造一个Station类,根据他的名字和属性判断,这个类有可能是描述一个物体的位置信息,这个信息可以解出四个变量分别赋值给不同的属性。疑问,感觉用substring 和indexOf的方法解析出数据比较麻烦,为什么本程序不用String的split方法呢?那会更省事点。另外这个程序是采用URL类的openStream()方法得到远端某一个网页上的数据,那网页可能是一个JSP,可以直接从数据库中取得数据,这个方法,省去了一个自建的Server程序,这种用法我是第一次看到,感觉学习到了一个新的应用方法的知识。

1.2.3.3.2 例题2:请写一段html,完成下列表格的样子。注意:是单线边框。

Java程序员,笔试必读_程序员
 
该题解释:
陷阱一:这道题初看起来很简单,似乎就是在考一个简单的“<table>”标记,于是有很多人都直接画出了一个table,至于单线边框的问题,他们总是用“border="1"”来描述table。
这样的话,画出来的图一定是这样的如图所示。
Java程序员,笔试必读_笔试_02
还是一个双线表格,并没有像上图一样的单线边框。

陷阱二:本题表格中的文字是大小写不同的,有的用的是小写,有的用的是大写,一定要按照要求回答问题,这主要考察的是按照要求完成任务的能力。

正确答案:
<table width="200" border="0" cellspacing="1" bgcolor="#000000">
  <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>
 
        如果你做过网页中的表格,一定知道应该用这个方法获得单线边框的表格,因为这是一个典型的单线表格设计方法。当然,有的人用CSS来回答这个问题,也可以算对,只是方法比较复杂了。

1.2.3.3.3 例题3:一个算法题
        再给大家一道据说是难倒很多人的题,这道题曾经有50人接受过提问,但是,只有3个人答对,请大家试试如何回答。
        要求:有两个数组一个N个元素,另一个M个元素,这两个数组中有些元素是相同的,希望通过编写一段程序将两个数组中的相同元素找出来,请用最少的循环次数完成需求,请问需要用什么方法?
        一般程序员马上会想到类似如下的程序:
for (int j=1;j<m;j++){
     for(int i=1;i<n;i++){
       ……
    }
}
 
那么,这个方法的循环次数是多少呢?
答:M*N个。
        但是,要注意这个题的要求是,最少的循环次数完成需求,这时候只要想想一共有几种方法完成这个任务即可,然后从中选择一个最快的就行了。
        正确的答案是,用哈希表的方法,这个方法的循环次数是M+N,一个是将M装入哈希表的循环,一个是将N逐个放倒M哈希表中去查询的次数。
        这道题有两个陷阱,第一个,“算法题”,一般有些程序员只要听到“算法”这个词,马上晕了,从而影响合理的思考。第二个陷阱是“最少”,用最少的循环次数的方法,而不是普通的,但就是这么两个陷阱使很多应聘程序员落马。

1.2.3.3.4 例题总结
        大家看看,上面的笔试题其实从技术方面来说都不难,但是陷阱比较多,而且,需要你能够有想象力,与出题者形成互动。从这几个例题可以看出,招聘单位最需要的人是实践能力强的人,因此,我们要从这个方面多下功夫,这些功夫获取途径仍然是加强日常的积累,本书的后面章节中也会涉及更多的类似经验,读者可以循序阅读。
清华大学出版社《Java程序员,上班那点事儿》作者:钟声