2010 的笔试,没有去年的43页,也就21页,除去了不同语言(java、c/c++、C#)的题,真正要做的也就16页左右,时间是够的。
基本上当了炮灰,所以在这里列出来,和大家分享一下。其实有很多都不是很难得问题,但是多了起来就很难发挥好。
session 1(必做)
有点变态,因为无论你什么语言,都必须答——我常用java,很久没有其他的,都忘了那些语言的特性了。
1 一只蜗牛,在一根10feet的杆上,每天向上3feet,晚上休息,下降1feet,问第几天什么时候到杆顶?(应该是考虑最后一天的情况)
2 考了java,对于类的static synchronized ,问:能不能编译通过,能不能锁住对象?
3 考了c#,问一下代码输出的是什么?主要有个printer2,搞了个new virtual在搞搞阵。
2 void print();
3 }
4
5 class Printer1:IPrint {
6 public void print(){ Console.WriteLine("Printer1.")} }
7
8 class Printer2:Printer1
9 {
10 public new virtual void print() { Console.WriteLine("Printer2.")} }
11 }
12
13 class Printer3:Printer2
14 {
15 public override void print() { Console.WriteLine("Printer3.")} }
16 }
17
18 class Printer4:Printer3
19 {
20 public override void print() { Console.WriteLine("Printer4.")} }
21 }
22
23 IPrinter ip = new Printer4();
24 ip.print();
4 考了java的一个分析wait/sleep/notifyAll 的题目,问有无死锁。
5 考了一个C++版的继承与派生的问题
2 {
3 int val;
4 public Base():val(5);
5 public virtual void print(){printf("%d",val);}
6 }
7
8 class Child
9 {
10 int _j;
11 public Child():_j(8);
12 public void print(){printf("%d",_j);}
13 }
14
15
问以下情况什么时候会输出88888
Child[5] c;
Base* p = (Base*)c;
for(int i=0;i<5;++i)
{
p->print();
++p;
}
B...
C
Base[5] c;
Child* p = (Child*)c;
for(int i=0;i<5;++i)
{
p->print();
++p;
}
D
Base[5] c;
Child* p = //用dynamicCast
for(int i=0;i<5;++i)
{
p->print();
++p;
}
6 考了C++一个编译的问题,问哪里有bug
{
T1* t1;
T2* t2;
public A():t1(new T1()),t2(new T2()){} //choice A
public A(const A& a){ //choice B
t1 = a.t1;
t2 = a.t2;
}
operator =(const A& a) //choice C
{
t1 = a.t1;
t2 = a.t2;
}
~A() throw() //choice D
{
delete t1;
delete t2;
}
}
据说是C,因为有内存泄露。原来的指针指向的空间没有释放掉。
7 以下的java会怎么样?
int value;
public void Foo() {
value = 100;
}
public Foo(int i) {
value = i;
}
public void print() {
System.out.println(value);
}
public static void main(String[] args)
{
Foo f1 = new Foo();
Foo f2 = new Foo(200);
f1.print();
f2.print();
}
}
a 输出100和200
b 编译不过,因为value没有初值
c 编译不过,因为没有默认构造函数(应该选这个,因为有个void Foo())
...
section2(必做,只不过是大题,上面的是选择题)
1 问实现一个priority queue需要用多少个queue实现? (不知道说什么)
2 两个已排序的O(n)的序列A、B,求两个序列merge后的中位数?如果能在O(logn)内满分,在O(n)内有一些分。
3 有两个文件夹,里面有很多文件,写一个算法,找到在一个文件夹里而不在另一个文件夹中的文件。
4 有一份文件,里面有2^32-1个数,取值范围是[0,2^32-1],系统内存只有几百k,请问如何找出[0,2^32-1]中不在文件中出现的数。
5 有一个密码锁,密码锁是转盘状,有40个数字(包括0)。按一次密码需要顺时针,先转到0,转密码的第一个数字,转到0,转密码第二个数字,如此类推。密码长度是3位。问最坏情况下转了多少个数字包括0。(排列组合的题目,描述也不很清楚)
6 写一个“非递归”的算法,找出pattern在长串中出现的位置,如输入长串是abcbc而pattern是abc时,要输出(0,1,2)、(0,3,4)、(0,1,4)
session2.1
根据自己的编程语言答题,java题目如下:
1 改写main,使得不抛出运行时异常
2
3 public class ConTest {
4
5 public ConTest(String... ops) {
6 System.out.println("Success");
7 }
8
9 public static void main(String[] args) {
10 Class<?> clazz;
11 try {
12 clazz = Class.forName("ConTest");
13 Constructor m = clazz.getConstructors()[0];
14 String a = "";
15 m.newInstance(a);
16
17 } catch (Exception e) {
18 // TODO Auto-generated catch block
19 e.printStackTrace();
20 }
21
22 }
23 }
24
事后试出答案是m.newInstance(new Object[] { new String[] { a } });
因为ConTest(String.. ops)等同于ConTest(String[] ops)
而newInstance(Object..objs)等同于newInstanec(Object[] objs) 然后就不知道怎么回事了
考试没得查真恼火,看看javadoc一分钟就能解决。
2 写一个类,里面用“数组”实现List接口,List接口只要求实现三个函数。(这个比较简单,主要要注意add的时候,数组需要增长的情况)
2 {
3 public boolean add(Object o);
4 public int indexOf(Object o); //给出了javadoc,如果不存在返回-1
5 public boolean remove(Object o); //如果不存在,不变,返回false
6 }