話說筆試是我的處子筆,發揮還算正常,有幸進入面試階段(處子面),由於學院不在合肥本部的特殊原因,我沒有在合肥參加宣講會,而是去了上海交通大學站,筆試時間是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)的方法嗎?