代码改变世界

网易笔试+面试

2013-04-08 18:39  Rudrj2  阅读(3241)  评论(1编辑  收藏  举报

  话说笔试是我的处子笔,发挥还算正常,有幸进入面试阶段(处子面),由于学院不在合肥本部的特殊原因,我没有在合肥参加宣讲会,而是去了上海交通大学站,笔试时间是21号晚上6:30开始到8:30。 观察了一下考场,人数不多,大约100号人。。那天由于很晚回来,而且之后几天实验和导师的任务,很忙没时间写笔经。。那就先从笔试说起吧!~网易笔试还是很难的,最后我看了下我的评分是B级,具体怎么弄的,我也不是很清楚,反正这是我的评分。ps:偷瞄的。

  第一部分:计算机基础(选择题都是多选题)

  1、选择题:按照e1、e2、e3、e3、的顺序进栈,出栈的顺序可能是下面的哪种?

  看了下都可以。所以直接写了ABCD

  2、中缀表达X=A+B*(C-D)/E式转后缀表达式。

  只有一个正确的。 有些选项是把中序进行变形,应该是移项之后再求后缀的。

  3、问以下排序算法哪些是不稳定的。 A 快速排序 B堆排序 C哈希排序 D冒泡排序 E 合并排序

  这个就不说了。堆,希尔,快排肯定是不稳定的

  4、(填空题)一个四叉树、有n个结点,每个结点都有四个指向它的四个孩子的指针,那么在这4n 个指针中,空指针有多少个______。

  这个算了下应该是4+3(n-1)

  5.&和移位的一道题,题目很长,没全部记下来,不过只要注意符号的优先级,慢慢算应该没问题。

  6.说的socket编程的问题

  

  11、(写程序)实现斐波纳契数列,写一个算法求数列的第n项的值。给出算法复杂度,尽量高效。 我是这样实现的,不知道是不是最优。

  先算一,二,然后推出三。。这样一直递归下去,后边的结果也能用到前面的结果,,最后时间复杂度只有O(n),但是貌似还有更优的,复杂度是O(logN),智商拙计只记得数学公式,不知道怎么代码实现了。。。

  12、内存分配和垃圾回收

  可能回答的比较宽泛,我写的是自己理解的。。貌似有些地方理解错了。。基于标记清理,复制暂停的回收方法,没怎么细写 。。我只写了关于堆的回收,内存分配是按linux 的  方式来写的,反正很挫。

  13、多线程并发控制012012012

  1 package kato22;
  2 
  3 public class test {
  4 
  5     public static void main(String[] args) {
  6         Num num = new Num();
  7         myThread0 my0 = new myThread0(num);
  8         myThread1 my1 = new myThread1(num);
  9         myThread2 my2 = new myThread2(num);
 10         new Thread(my0).start();
 11         new Thread(my1).start();
 12         new Thread(my2).start();
 13 
 14     }
 15 }
 16 
 17 class Num {
 18     int i = 0;
 19     int tmp;
 20 
 21     public void first() {
 22         System.out.print("0");
 23         tmp = 1;
 24         i++;
 25     }
 26 
 27     public void second() {
 28         System.out.print("1");
 29         tmp = 2;
 30         i++;
 31     }
 32 
 33     public void third() {
 34         System.out.print("2");
 35         tmp = 0;
 36         i++;
 37     }
 38 
 39     public synchronized void numed() {
 40         if (i < 8) {
 41             notifyAll();
 42         }
 43     }
 44 
 45     public synchronized void wait0() throws InterruptedException {
 46         while (tmp != 2) {
 47             wait();
 48         }
 49     }
 50 
 51     public synchronized void wait1() throws InterruptedException {
 52         while (tmp != 0) {
 53             wait();
 54         }
 55     }
 56 
 57     public synchronized void wait2() throws InterruptedException {
 58         while (tmp != 1) {
 59             wait();
 60         }
 61     }
 62 
 63 }
 64 
 65 class myThread0 implements Runnable {
 66 
 67     private Num num;
 68 
 69     public myThread0(Num n) {
 70         num = n;
 71     }
 72 
 73     @Override
 74     public void run() {
 75         try {
 76             while (!Thread.interrupted()) {
 77                 num.first();
 78                 num.numed();
 79                 num.wait1();
 80             }
 81         } catch (InterruptedException e) {
 82             System.out.println("interrupt");
 83         }
 84     }
 85 
 86 }
 87 
 88 class myThread1 implements Runnable {
 89 
 90     private Num num;
 91 
 92     public myThread1(Num n) {
 93         num = n;
 94     }
 95 
 96     @Override
 97     public void run() {
 98         try {
 99             while (!Thread.interrupted()) {
100                 num.wait2();
101                 num.second();
102                 num.numed();
103 
104             }
105         } catch (InterruptedException e) {
106             System.out.println("interrupt");
107         }
108     }
109 
110 }
111 
112 class myThread2 implements Runnable {
113 
114     private Num num;
115 
116     public myThread2(Num n) {
117         num = n;
118     }
119 
120     @Override
121     public void run() {
122         try {
123             while (!Thread.interrupted()) {
124                 num.wait0();
125                 num.third();
126                 num.numed();
127             }
128         } catch (InterruptedException e) {
129             System.out.println("interrupt");
130         }
131     }
132 
133 }

 

 14、异常处理,finally和数据库连接不存在

 异常处理原则:早throws晚catch。异常具体化。。

输入输出流必须在finally中关闭,否则发生异常导致io未正常关闭。jdbc连接在数据库不存在时的异常未被catch。

    总结了一下:(当时只写了上面几条)
  1、尽量避免使用异常,将异常情况提前检测出来。 2、不要为每个可能会出现异常的语句都设置try和catch。 3、避免在方法中抛出(throw)或者捕获(catch)运行时异常RuntimeException和Error。 4、避免总是catch Exception或Throwable,而要catch具体的异常类。这样可以使程序更加清晰。 5、不要压制、隐瞒异常。将不能处理的异常往外抛,而不是捕获之后随便处理。 6、不要在循环中使用try...catch,尽量将try...catch放在循环外或者避免使用。 7、在catch Exception中不只要处理异常,有时还要出栈、对前面的一些变量进行处理,否则可能出现bug
     //(1)尽量避免使用异常,将异常情况提前检测出来
        Stack<Object> stack = new Stack();
        try...{
            stack.pop();
        } catch (EmptyStackException e) ...{
            //....
        }
        //应该用下面的方式,以避免使用异常
        if (!stack.isEmpty()) ...{
            stack.pop();
        }
        
        //(2)不要为每个可能会出现的一场的语句都设置try和catch
        try...{
            stack.pop();
        } catch (EmptyStackException e) ...{
            //....
        }
        String data = "123";
        try ...{
            Double.parseDouble(data);
        } catch(NumberFormatException e)...{
            //....
        }
        //应该使用下面的方式,将两个语句放在一个try块中
        try...{
            stack.pop();
            Double.parseDouble(data);
        } catch(EmptyStackException e) ...{
            //....
        } catch(NumberFormatException e) ...{
            //....
        }
        
        //(3)避免在方法中抛出或者捕获运行时异常RuntimeException和Error,
        //比如内存错误等
        //避免出现下面的情况
        String[] array;
        try ...{
            array = new String[1000];
            //array = new String[1000000];此时会出现OutOfMemoryError异常
        } catch (OutOfMemoryError e) ...{
            throw e;
        }
        //直接用下面代码
        array = new String[1000];
        
        //(4)避免总是catch Exception或Throwable,而要捕获具体的异常
        //这样可以根据不同的异常做不同的处理,使程序更加清晰
        try ...{
            stack.pop();
            Double.parseDouble(data);
        } catch (Exception e) ...{
            //应该避免catch Exception !!!
        }
        
        //(5)不要压制、隐瞒异常。将不能处理的异常往外抛,而不是捕获之后随便处理
        try...{
            Double.parseDouble(data);
        } catch (NumberFormatException e) ...{
            //.....
            throw e;    //抛出不能处理的异常,而不是隐瞒
        }

 

下面是面试环节:

第一轮:集合类,多线程,static, finally final finalized ,wait sleep , hashtable 和hashmap ,service ,ontouch ,aidl ,binder;

 

容器主要问关于set,map,list,的特性及collections的的特性,其他有时间再细化。。最近太忙

 

第二轮:项目当中的问题。视频播放处理,加解密 ,ndk,java基本类型和位 ,wait sleep ,线程安全, 视频降噪;聊了会Ruby,貌似对我本科做的android项目的回答不是很满意,好多东西长时间没看,还是要复习复习,自己做的也会忘记。

 

最后一轮面试:自我介绍,,性格,,缺点,,网易认识的人,杭州的熟人,为毛不去北京上海,实习期,期望工资

 

生日之际,拿到了网易的实习offer,除了父亲的短信之外唯一能够得到的安慰吧。奔跑吧,少年!~

最后再加道网易笔试题:

给一个整数数组, 找到其中包含最多连续数的子集,
比如给:15, 7, 12, 6, 14, 13, 9, 11,
则返回: 5:[11, 12, 13, 14, 15] 。
最简单的方法是sort然后scan一遍,但是要o(nlgn).
有什么O(n)的方法吗?