筆試
有一個教訓是,題目讓你編程實現的,不要羅列一大堆思想方法,編程麼,就是把你的代碼寫上去,比如寫個非遞歸的中序遍歷二叉樹,都知道用個棧就好了,但是還是要寫的。
嵌入式中最常考的就是
(1)運算符優先級,實在記不下來,每次去前看一遍(沒辦法,人家非要考)
(2)用變量a給出下面的定義(《程序員面試寶典》,後面很多題都是其中的),注意a)一個指向有10個整型數數組的指針 b)一個指向函數的指針,該函數有一個整型參數並返回一個整型數 c)一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數
(3)結構體佔用內存空間大小的計算,然後優化;考察內存對齊(爲什麼要對齊?),其實不同編譯器,不同平臺都是有差別的,但既然要考,把基本的弄清楚。
(4)剩下的對const的理解,#define和inline的區別,typedef、volatile的理解使用以及值傳遞、地址傳遞,內存空間分配(堆棧)等寶典上都有。
(5)這裏加兩個代碼的:a)CPU大小端的判斷(要理解)
- int check_endian(){
- union w{
- int a;
- char b;
- }
- c.a = 1;
- return (c.b == 1)
- }
b)求二進制數中1的個數(《編程之美》),這個很常用,是一些問題的基礎,其中a是要求1個數的數
- int num = 0;
- while(a){
- a &= (a-1);
- num++;
- }
- return num;
(6)Java中主要涉及接口、抽象類的理解,異常處理機制
(7)對內存回收時機的考察(恰當時候,不是一定回收),finalize的執行,順帶的可以和final、finally的理解一起出現,而且注意finally即使在return後面,也照樣執行;有些公司考到內存的分代回收,可以瞭解下。
(8)字符串常量池的理解,題目的話就是結合new創建對象和==、equal,問你創建了幾個對象,判斷兩個對象是否相同,一般記住new肯定創建新的引用,而是否指向同一個字符串用==無法判斷,而單獨聲明String對象,那麼就沒有新創建對象。
(9)String類的+操作,StringBuild的優化和StringBuffer的區別,相類似的對各種容器的區別理解(List,Set,Map),而且會說到線程安全SynchronizedMap和ConcurrentHashMap的區別;至於真的考察Java中I/O類的聯合使用,那就靠自己的經驗了。
(10)內部類、泛型、反射好好看看《Java編程思想》,基本應該能搞定。而且你還會看到是否有sizeof,線程之間的協作問題等等。
面試
不管答案怎樣,面試的心態和表達技巧一定要多學習,不要僅僅回答是或否,要有條理的展開,否則一個小時左右的面試會有各種各樣的問題,總有你答的不好的;面試是個人和人交流的過程,但是簡單基礎的問題千萬別錯,否則後面一點機會沒有。
(1)必問:進程間通信、寫個擅長的排序或者網絡公司問個TCP、UDP區別,其實可以從問你DNS、HTTP、Ping等屬於哪一層,底層是基於傳輸層的什麼來考察你的;還有就是各種權限相關的,序列化相關,C++的虛函數實現,Java的內存回收機制,強調的是要用自己的話說出來,儘量不要去背。嵌入式的基本nand nor Flash的區別以及筆試中的大小端、宏定義、斷言等問題也常在面試中出現。
(2)常問在《編程之美》上的如摸石頭的遊戲3篇, 求二進制數中1的個數 ,尋找最大的K個數,斐波那契(Fibonacci)數列,數組相關的如 求數組的子數組之和的最大值,求數組中最長遞增子序列 以及 桶中取黑白球等,很多是原題,也有就是以此爲基礎來做的; 比如百萬級數量的IP段,一個區段對應一個地方(比如北京,西安之類),給一個IP查找確定是哪個地方
(3)設計模式 23個常用的要了解一下,單例模式要會實現,看看我推薦的書應該問題也不大的。
(4)Android相關的也是些框架的理解,進程間通信,四大組件的理解使用,從這些問題上看看你到底用到、學習到一個什麼樣程度,對錯估計不是特別在意的。
(5)非技術性的就是些項目難點,收穫,感受,你的優勢,證明你的能力之類,還有就是你期望的工作環境、氛圍,職業規劃,理想;有時會遇到壓力的優缺點,把一個MP3推銷給聾子等問題。補充一下的是,有時候會從你做的項目中問你對產品的思考,包括UI、功能實現,性能優化等等。面試還是針對公司的特點,多看以往的面經比較好。
最後要說的是不管你大二、大三,研一、研二,其實對於找實習都是個非常好的鍛鍊機會,早早的瞭解自己的優勢和需要彌補的地方,同時也能證明你是個用心,早做準備之人,機會是留給有準備的人的,祝你好運!後面會再寫一篇關於工作,關於人生道路的選擇的。