话说笔试是我的处子笔,发挥还算正常,有幸进入面试阶段(处子面),由于学院不在合肥本部的特殊原因,我没有在合肥参加宣讲会,而是去了上海交通大学站,笔试时间是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)的方法吗?