摩根IT笔试

2010 的笔试,没有去年的43页,也就21页,除去了不同语言(java、c/c++、C#)的题,真正要做的也就16页左右,时间是够的。

基本上当了炮灰,所以在这里列出来,和大家分享一下。其实有很多都不是很难得问题,但是多了起来就很难发挥好。

session 1(必做)

有点变态,因为无论你什么语言,都必须答——我常用java,很久没有其他的,都忘了那些语言的特性了。

1 一只蜗牛,在一根10feet的杆上,每天向上3feet,晚上休息,下降1feet,问第几天什么时候到杆顶?(应该是考虑最后一天的情况)

2 考了java,对于类的static synchronized ,问:能不能编译通过,能不能锁住对象?

3 考了c#,问一下代码输出的是什么?主要有个printer2,搞了个new virtual在搞搞阵。

 1 IPrint{
 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++版的继承与派生的问题

 1 class Base
 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

代码
class A<T1,T2>
{
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会怎么样?

代码
public class Foo {
    
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,使得不抛出运行时异常

 1 import java.lang.reflect.Constructor;
 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的时候,数组需要增长的情况)

1 public interface List
2 {
3 public boolean add(Object o);
4 public int indexOf(Object o); //给出了javadoc,如果不存在返回-1
5 public boolean remove(Object o); //如果不存在,不变,返回false
6 }


原文地址:https://www.cnblogs.com/anic/p/1709119.html