交大學子技術類筆試經驗分享

  經過將近2個月的折騰,job hunter的日子也已經over了。無數次上這個版,今天冒著被取消offer的危險給大家泄點題,來點面經,給學第學妹們多點參考資料。希望大牛們不要嘲
笑我,主要是面向學弟學妹們或者將來要找工作的同學的參考資料,針對cs||se方向的同
學。

  首先,談談筆試的電面。筆試或者電面一般是公司挑人的第一關,而在這一輪,不同公司
會有不同的風格,但是大體上,掌握好這些東西肯定是錯不了。

  1. english , 外企筆試或者電面基本都是用英語的,所以英語至少要看得動,能跟他們聊。其實周圍蠻多同學對自己英語沒有自信,其實我認為只要過了6級就這一關就肯定夠用了
。尤其是電面的時候,技術上可能是用中文說,部分公司(morgan...)除外,但是總歸得準
備一份流利的英語自我介紹對不對?

  2. 基本學科 。像google, baidu這樣的公司只考算法,其實基本學科的東西相對就比較弱了。但是其他公司基本上就是你這幾年學到的東西,首先當然是coding能力,要不寫 cod
e,要不看code,  在筆試的時候只需寫出思路就行了,不必每個變數,每個循環就斤斤計較;但是在微軟電面的時候會有一個live meeting的東西共享一個記事本,讓你在上面寫code, 這時就最好注意一下你的coding style, 包括方法變數命名,先寫test case, 考慮周不周到,而且微軟那邊特別愛考字元串轉int, int轉字元串;比如後者,你就要先考慮int有沒有可能是數;是不是可以擴展把進制用變數或者參數描述;在求int的位數(字元串長度)的時候怎樣求,用循環除以進制數還是直接用log的方法等等。基本coding能力還是很重要地。

  其次就是各個科目了,數據結構:很多人說這個很重要,其實這個沒有想像中的需要那么
多的精力,只需要知道概念就是了,鍊表,二叉樹,圖,基本排序算法這些概念要知道;
比如二叉樹中序+前序(後序)能決定其排列等基本性質;

  然後類似於一些比較經典的算法題目:

  如何判斷兩個鍊表是否有交叉點,鍊表信息不知道,希望是o(n)的算法,而且o(1)的空間;

  同樣不知道鍊表信息,如果判斷一個鍊表是否有環?

  如何在大數組裡去重?

  如何在兩個二叉樹中求得最大子樹(高度最高)?

  其實算法這個東西我也不知道怎樣準備,知道一些基本概念(遞歸,回溯,hash, 動態規劃,分支之類的)然後平時可以多上acm的網站練練手,做多了也就有感覺了(其實我自己都沒
怎么做過這些題目)

  網路:總歸得知道tcp/ip的7層協定,沒層是做什麼的,有哪些代表協定,其中最重要的就是網路層和傳輸層,ip地址,子網掩碼的作用及原理, icmp(ping), nslookup, netstat 之類的命令也應該有所了解;tcp/udp有什麼區別; 資料庫: 總歸得知道基本sql語句怎么寫,包括一些基本函式(max, sum),和一些in, some, all的關鍵字,其次事務的基本性質(acid) 隔離級別範式的概念也要知道;作業系統,這個學的時候肯定要好好學,不過貌似面試的時候不會考得很深,比如進程執行緒的區別啦,進程調度算法,死鎖形成4大要素以及分別對應的解決方案,比較容易考的是銀行家算法,以及虛存頁面置換算法,比較容易考的是lru,最好的工作集反而考得不多;其他科目就可以忽略啦 哈哈但是不是讓大家不學。

  筆試的時候一般會有智力題目,像之前在筆試微軟的時候居然有一道"愛因斯坦的超級問題",這個沒什麼好準備的,能做就做,不能做準備也沒用,具有比較大的偶然性,所以可以
不管這一塊;

  再來說說面試:

  對於我來說,筆試或者電面過了,面試我就不怎么害怕了。因為面試有個很大的優勢是你是跟他當面交流的,可以有肢體語言,尤其是眼神上的交流,尤其是技術面,如果你搞不
定的時候可以從眼神里獲得提示,反正面試的時候就淫笑著盯著她(他)眼睛看,保你沒事,呵呵;如果是聊天面,這下你就要掌握好這個度了,要在前幾句話看出這個人nice不nice, 像不像要卡人的人,如果是的話,就要注意了,不要亂說話,要打七寸;如果不是,就不要擔心拉,隨便吹,吹你有多厲害,當然要保持謙虛,我想大家應該都能掌握這個度
的;

  所以我覺得在面試的時候關鍵還是要淫笑+暗送秋波。

  接下來說說我遇到的或者同學遇到的一些筆試面試題目吧,僅供大家參考:

  1. 兩顆二叉樹求最大相同子樹(高度最高);

  2. 把一般的加減法改成波蘭後綴式;

  3. 兩個很大的檔案,每個檔案有數千萬行,沒行都是一個字元串,求兩個檔案中字元串相同的行,也就是求交集;

  4. 有10個球,球和球之間沒有區別,分成 n堆,隨便你,做這么一個操作,從每堆裡面拿出一個,放到最後形成一個新的堆,比如一開始是分成兩堆,每堆5個, 序列是(5, 5),
一次操作之後序列成為(4, 4, 2), 再一次之後變成(3, 3, 1, 3), 求證經過有限次操作之
後,序列一定會變成(1, 2, 3, 4),不能用類似於枚舉這樣的算反,要數學邏輯上的推斷(至今仍未搞定)

  5. 掃描病毒最佳化。假設有一個病毒庫,很大,有成千上萬個,為了簡單,假設全部是一定序列的字元串;在掃描病毒的時候,最簡單的辦法就是把一個檔案用這成千上萬個病毒庫
都匹配一次,如果全部都沒匹配上,則證明該檔案是安全的;但是磁碟上的檔案也不是個
小數目,求最佳化;

  6. 咱們在google或者baidu的時候都會有大量的重複網頁,怎樣判斷+去重;

  7. 一個遊戲,我把你眼睛蒙上,然後在一張鏇轉的桌子上面方有4個硬幣,放在正方形的4個角上,你讓我做操作翻硬幣,一旦4個硬幣的狀態(正面朝上||反面朝上)一致,則告訴
你你贏了,求能讓你必贏的操作序列;

  8. 在一個只有加法(+)和比較(==)的機器上,實現+, -, *, /四種功能;

  9. 設計一個搜尋時用的cache;

  10. 一次遍歷找出一個鍊表的最大的n項(coding);

  11. josephus 問題(燙手的土豆的遊戲);

  12. 一個國家只喜歡男孩,不喜歡女孩,沒對夫婦最後都以生孩子都是一直生到男孩為止,求這個國家的男女比例;

  13.  甲向乙借了ab.cd元錢,乙催帳,甲為了還乙錢,向丙借ab.cd的錢,但是丙沒有現金,只要給了甲一張支票,甲到銀行換錢的時候呢,銀行小姐失誤了,給了他cd.ab元,這樣
呢,甲不但還了兩個人的錢還剩了1元錢,求 a, b, c, d;

  14. 如果我vpn一直連線不上,請問你怎么解決這個問題;

  15. 給你兩部一模一樣的手機,有100層樓,你要給我最高從多少層樓仍下這部手機的時候手機不會壞掉,求最少的仍的次數;

  16. 還有一些開放性的題目,上海市一個有多少個網球,多少個下水道蓋之類的;

  祝各位好運