九月十月百度,迅雷,華為,阿里巴巴筆試面試六十題(第411~470題)

逸卿發表於2014-04-13

  九月十月百度,迅雷,華為,阿里巴巴,最新校招筆試面試六十題



題記

    本部落格自2010年10月11日開通以來,已經幫助了一大批人找到工作,特別是連續三年在每一年的9、10月份陪伴了至少三屆畢業生找工作的旅程,包括校招中的筆試面試,今年也不會例外,我會在本部落格開通3週年之際一如既往的陪伴大家一起成長。

    本文所整理的全部筆試面試題要麼來源於我群內群友們的分享,要麼摘自論壇或部落格,所有原題均來自網路。雖然本文中整理的絕大部分筆試面試題偏演算法(自己特意為之之故),但不論是哪一年的校招,一般說來,筆試偏基礎尤其是選擇題部分,涵蓋語言,計算機組成原理、作業系統、網路協議、資料庫、概率期望等知識),而面試則偏演算法(且極具針對性的根據簡歷提問),且無論是筆試還是面試,兩者都很看重你的實際程式設計能力,希望大家知曉。

   OK, 本文會盡量保持每天更新一道新的筆試或面試題,直到校招基本結束(更歡迎各位通過微博私信http://weibo.com/julyweibo,或郵箱zhoulei97@aliyun.com提供題目,亦可直接評論於本文下),如果大家對以下任何一題中有任何思路,包括參考題解中有任何錯誤,歡迎隨時評論於本文之下,或show me your code!謝謝。


九月迅雷,華為,阿里巴巴,最新筆試面試十題

  1. 8月15日,百度2道面試題:
    1、來自《程式設計之美》的概率題:一個桶裡面有白球、黑球各100個,現在按下述規則取球:的
        i 、每次從通裡面拿出來兩個球;
        ii、如果取出的是兩個同色的求,就再放入一個黑球;
        ii、如果取出的是兩個異色的求,就再放入一個白球。
    問:最後桶裡面只剩下一個黑球的概率是多少?
    2、演算法題:給你一個自然數N,求[6,N]之內的所有素數中,兩兩之和為偶數的那些偶數。
  2. 9月5日,華為2014校園招聘的機試題目
    通過鍵盤輸入一串小寫字母(a~z)組成的字串。請編寫一個字串壓縮程式,將字串中連續出席的重複字母進行壓縮,並輸出壓縮後的字串。
    壓縮規則:
        1、僅壓縮連續重複出現的字元。比如字串"abcbc"由於無連續重複字元,壓縮後的字串還是"abcbc"。
        2、壓縮欄位的格式為"字元重複的次數+字元"。例如:字串"xxxyyyyyyz"壓縮後就成為"3x6yz"。
    要求實現函式: 
         void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
        輸入pInputStr:  輸入字串lInputLen:  輸入字串長度
        輸出 pOutputStr: 輸出字串,空間已經開闢好,與輸入字串等長;
    注意:只需要完成該函式功能演算法,中間不需要有任何IO的輸入輸出
    示例 
        輸入:“cccddecc”   輸出:“3c2de2c”
        輸入:“adef”     輸出:“adef”
        輸入:“pppppppp” 輸出:“8p”
  3. 9月6日,網新恆天2014校園招聘筆試程式設計題
    已知memcpy的函式為: void* memcpy(void *dest , const void* src , size_t count)其中dest是目的指標,src是源指標。不呼叫c++/c的memcpy庫函式,請編寫memcpy。
    點評:老題,參考答案如下
    1. //copyright@July 2013/9/24  
    2. void* memcpy(void *dst, const void *src, size_t count)      
    3. {      
    4.     //安全檢查  
    5.     assert( (dst != NULL) && (src != NULL) );      
    6.   
    7.     unsigned char *pdst = (unsigned char *)dst;      
    8.     const unsigned char *psrc = (const unsigned char *)src;      
    9.   
    10.     //防止記憶體重複  
    11.     assert(!(psrc<=pdst && pdst<psrc+count));      
    12.     assert(!(pdst<=psrc && psrc<pdst+count));      
    13.   
    14.     while(count--)      
    15.     {      
    16.         *pdst = *psrc;      
    17.         pdst++;      
    18.         psrc++;      
    19.     }      
    20.     return dst;      
    21. }    
  4. 9月9日,迅雷2014校招筆試程式設計題:
    已知集合A和B的元素分別用不含頭結點的單連結串列儲存,函式difference()用於求解集合A與B的差集,並將結果儲存在集合A的單連結串列中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成計算後A={10,20,30}。
    連結串列結點的結構型別定義如下:
    1. struct node    
    2. {    
    3.     int elem;    
    4.     node* next;    
    5. };    
    請完成函式void difference(node** LA , node* LB)
    點評:參考答案或更多題目請參見:http://blog.csdn.net/hackbuteer1/article/details/11482103
  5. 9月10日,美團網2014校招研發筆試哈爾濱站
    1、連結串列翻轉。給出一個連結串列和一個數k,比如連結串列1→2→3→4→5→6,k=2,則翻轉後2→1→4→3→6→5,若k=3,翻轉後3→2→1→6→5→4,若k=4,翻轉後4→3→2→1→5→6,用程式實現
    點評:類似程式設計藝術第1章左旋轉字串,見:http://blog.csdn.net/v_JULY_v/article/details/6322882
    2、一個m*n的矩陣,從左到右從上到下都是遞增的,給一個數elem,求是否在矩陣中,給出思路和程式碼
    點評:楊氏矩陣查詢,見程式設計藝術第23章:http://blog.csdn.net/v_july_v/article/details/7085669
  6. 9月14日,阿里巴巴2014校招筆試哈爾濱站
    1、宿舍內5個同學一起玩對戰遊戲。每場比賽有一些人作為紅方,另一些人作為藍方。請問至少需要多少場比賽,才能使任意兩個人之間有一場紅方對藍方和藍方對紅方的比賽?答案為4場,參考如下圖,作者doc_sgl:

    點評:其餘題目請參見:http://blog.csdn.net/doc_sgl/article/details/11695671
    2、一個有10億條記錄的文字檔案,已按照關鍵字排好序儲存。請設計演算法,可以快速的從檔案中查詢指字關鍵字的記錄。
  7. 9月14日,阿里巴巴-系統工程師-北京站

    其它題目請參見:http://blog.csdn.net/lingfengtengfei/article/details/12344511
  8. 9月16日,創新工場2014校招筆試題

    點評:上面第3題還是楊氏矩陣查詢,見程式設計藝術第23章:http://blog.csdn.net/v_july_v/article/details/7085669。既然這麼多公司都喜歡考楊氏矩陣查詢,那麼再給出楊氏矩陣查詢一題的擴充套件:給定 n×n 的實數矩陣,每行和每列都是遞增的,求這 n^2 個數的中位數,分析詳見:http://zhiqiang.org/blog/science/computer-science/median-algorithm-of-ordered-matrix.html
  9. 9月21日,百度2014校招-濟南站

  10. 9月21日,騰訊2014軟體開發校招-簡答題-廣州

    點評:這裡有一關於上面2題的題解:http://blog.csdn.net/thebestdavid/article/details/12056293,可以參考。
  11. 9月22日,人人校招筆試題

    點評:上述第1題尋找滿足條件的兩個數,見程式設計藝術第5章:http://blog.csdn.net/v_JULY_v/article/details/6419466;上述第2題見程式設計藝術第21章:http://blog.csdn.net/v_july_v/article/details/6890054
  12. 9月22日,阿里巴巴北郵站



    點評:這裡有一朋友關於上述3題的題解:http://blog.csdn.net/thebestdavid/article/details/11975809,大家可以參考。
  13. 9月23日,網易電商部-社招面試
    HashMap與HashTable區別
    點評:HashMap基於Hashtable實現,不同之處在於HashMap是非同步的,並且允許null,即null value和null key,Hashtable則不允許null,詳見:http://oznyang.iteye.com/blog/30690。此外,記住一點:hashmap/hashset等凡是帶有hash字眼的均基於hashtable實現,沒帶hash字眼的如set/map均是基於紅黑樹實現,前者無序,後者有序,詳見此文第一部分:http://blog.csdn.net/v_july_v/article/details/7382693
    不過,估計還是直接來圖更形象點,故直接上圖(圖片來源:本人9月28日在上海交大面試&演算法講座的PPThttp://vdisk.weibo.com/s/zrFL6OXKg_1me):

  14. 9月24日,去哪兒網2014校招西安站筆試題
    給定一個200MB的文字檔案,裡面存的是IP地址到真實地址資訊的對映資訊,例如:211.200.101.100北京
    然後給你6億個IP地址,請設計演算法快速的列印出所對應的真實地址資訊。
  15. 9月25日,阿里巴巴二面
    指標/陣列區別,決策樹訓練原理,SVM原理,網路協議,堆排序,字串轉換成整數,設計一款拼音輸入法等等..
    點評:字串轉換成整數看似簡單,實則很多坑,要寫好並不容易,具體分析和實現見程式設計藝術第30章:http://blog.csdn.net/v_july_v/article/details/9024123;決策樹見:http://blog.csdn.net/v_july_v/article/details/7577684;SVM原理見:http://blog.csdn.net/v_july_v/article/details/7624837
    總結:此次面試的這位同學面的還是堆排/快排/atoi等典型問題,實際上:①面試看基礎演算法程式設計能力,和準備是否充分;②不論結果如何,跟4年前高考一樣,高考和麵試都只是人生路上的其中一站。你的真正核心競爭力不是進哪所名校哪所名企,而是存在你骨子裡的上進心或熱愛鑽研技術的態度。
  16. 9月28日,微軟2014校招筆試題最後一道

    點評:上題形式上類似程式設計藝術第35章完美洗牌演算法http://blog.csdn.net/v_july_v/article/details/10212493#t8,但因給定的是連結串列,所以相對來說,簡單了不少;微軟2014校招其它題目見:http://blog.csdn.net/xiaoerlyl/article/details/12126807
  17. 9月28日,百度2014校招-武漢站-系統分析師

  18. 10月2日,暴風影音2014校招筆試
    1、合併兩個已經排序的單連結串列為一個排序的單連結串列,相同內容只保留一個
    如:單連結串列a:1->2->3->4
    單連結串列b:3->4->5
    輸出:1->2->3->4->5
    2、編寫程式,在原字串中把尾部m個字元移動到字串的頭部,要求:長度為n字串操作時間複雜度為O(n),時間複雜度為O(1)。
    如:原字串為”Ilovebaofeng”,m=7,輸出結果:”baofengIlove”。
    點評:還是類似程式設計藝術第1章左旋字串:http://blog.csdn.net/v_JULY_v/article/details/6322882
    3、暴風影音的片源伺服器上儲存著兩個檔案a和b,各存放50億條URL,每條URL佔用64位元組,記憶體限制是4G,讓你找出a,b檔案共同的URL。要求:演算法設計。
    點評:上述第3題等海量資料處理面試題,請參見此文第第一部分第6題:http://blog.csdn.net/v_july_v/article/details/7382693
  19. 關於linux核心的幾個面試問題:
    1、Linux中主要有哪幾種核心鎖?
    2、Linux中的使用者模式和核心模式是什麼含意?
    3、使用者程式間通訊主要哪幾種方式?
    4、有哪幾種記憶體分配函式?
  20.  微軟一面:輸入兩個數,相加求和,二進位制輸出。
  21. 阿里巴巴面試:
    阿里的log檔案如下,有三個欄位:time(登陸或登出時間點)+uid+login或logout,每條記錄按時間順序排列。問題如下:給定一個時間點T,統計線上人數。 
    點評:參考分析請見http://blog.csdn.net/tnndye/article/details/12784237
  22. 10月8日,百度移動開發-上海站筆試/面試題
    1、三色球排序的問題,相同的球放到一起,讓你按順序輸出紅白藍三種顏色的球,可以用012來表示,要求只能掃描一次陣列。
    點評:荷蘭國旗問題,參見此文第8小節:http://blog.csdn.net/v_july_v/article/details/6211155
    2、實現C的strstr
    點評:手寫字串處理相關函式是面試中極為常見的一類題型。
    功能:從字串str1中查詢是否有字串str2,
    -如果有,從str1中的str2位置起,返回str1中str2起始位置的指標,如果沒有,返回null。
    給兩份參考程式碼,一份是C程式碼:
    1. char *mystrstr(char *s1 , char *s2)  
    2. {  
    3.     if(*s1==0)  
    4.     {  
    5.         if(*s2)   
    6.             return(char*)NULL;  
    7.         return (char*)s1;  
    8.     }  
    9.     while(*s1)  
    10.     {  
    11.         int i=0;  
    12.         while(1)  
    13.         {  
    14.             if(s2[i]==0)   
    15.                 return s1;  
    16.             if(s2[i]!=s1[i])   
    17.                 break;  
    18.             i++;  
    19.         }  
    20.         s1++;  
    21.     }  
    22.     return (char*)NULL;  
    23. }  
    一份是C++程式碼:
    1. //copyright@caopengcs 2013/10月  
    2. class Solution {  
    3. public:  
    4.     char *strStr(char *haystack, char *needle) {  
    5.         // Start typing your C/C++ solution below  
    6.         // DO NOT write int main() function  
    7.         int i,j;  
    8.         for (i = j = 0; haystack[i] && needle[j];) {  
    9.             if (haystack[i] == needle[j]) {  
    10.                 ++i;  
    11.                 ++j;  
    12.             }  
    13.             else {  
    14.                 i = i - j + 1;  
    15.                 j = 0;  
    16.             }  
    17.         }  
    18.         return needle[j]?0:(haystack + i - j);  
    19.     }  
    20. };  
    3、寫一個memmove的函式
    點評:手寫常見字串處理函式是面試官很喜歡考的一類題型。
  23. 10月9日,暴風影音校招研發筆試
    1、給定字串A和B,輸出A和B中的第一個最長公共子串,比如A=“wepiabc B=“pabcni”,則輸出“abc”。
    2、TCP建立連線的3次握手過程?若最後一次握手失敗,會怎樣處理?
  24. 蜻蜓FM2014校招研發筆試

  25. 10月11日,騰訊web前端面試
    一個陣列 var arr = ['abc','ddadbc','adbdcd','abcqew'.......] 長度一萬,  用最有效率的方法計算出包含被元素出現最多的。
  26. 單機5G記憶體,磁碟200T的資料,分別為字串,然後給定一個字串,判斷這200T資料裡面有沒有這個字串,怎麼做?
    如果查詢次數會非常的多, 怎麼預處理?
    點評:如果資料是200g且允許少許誤差的話,可以考慮用布隆過濾器Bloom Filter:http://blog.csdn.net/v_july_v/article/details/6685894。但本題是200T,得另尋良策。
    OK,以下是@cy 提供的題解(暴露出的一個問題是題意不是特別明確,因為題解中有不少自己的假設,所以日後各位面試時一定要跟面試官徹底弄清題意再作答,包括各種使用條件):
    ①. 記憶體和資料比是 5GB / 200TB, 約為 1 比 4w, 所以trie啥的就不用想了, 唯一的就是hash.
    ②. 簡單的假設每個字串是相對短的(只要不會超過5GB)
        1. 幾MB, 甚至百MB的字串也能處理, 但是確實對最終的效果有很大影響, 如果只是部分case特別大,可以特殊處理下.
    ③. 一個字串塊 在記憶體中需要一個 條目 來標識
        1. value 需要 8 位元組, key約為4位元組
            1. 200TB總共有 200 * 2^40 位, 地址空間至少為48個bit, 儲存長度用16bit則一個條目的value 需要8個位元組
        1. 這裡的長度是用來存一個 字串塊 的長度, 單位可以優化為KB, 甚至MB, 16bit肯定是夠的
        1. key用4個位元組有些緊張, 可以考慮佔用部分長度的位
        1. 長度也可以不在條目中出現, 而是在塊頭出現, 但這樣取塊的時候有可能浪費, 也有可能要取多次.
        2. 所謂一個 字串塊 就是hash值相同的字串挨個存在一起, 從而得到的字串塊.
    ④. 這樣的話, 5GB 可以存放最多 5GB / 8 約為 4億個條目.
    ⑤. 把原來的200TB字串挨個的hash, 並按hash排序後, 存起來, 建立索引. 
        1. hash值可以用md5之類的雜湊到足夠開, 然後 mod 4億值來求
    ⑥. 根據重排後的檔案, 建立索引, key為hash值, value為前面說到的, 該hash對應字串塊在檔案中的偏移, 和 塊的長度.
    ⑦查詢時, 根據hash值, 找到該字串可能在的字串, 然後將整個字串讀出來, 用kmp比較即可. 
    200TB的資料, 被劃到 4億 個字元塊當中, 平均一塊應該在 800KB 附近, 考慮到hash不均衡, 一般也就是幾MB的樣子, 
    比較起來應該還OK. 
    ⑧其他的小優化點: 
        1. 不是一個檔案, 而是若干個檔案, 但是不影響偏移的編號
        1. 為什麼做hash再分塊? 避免通用字首過多,導致分塊極不均勻
        1. 大長的字串容易導致 字串塊 暴大, 可以考慮分為若干小串, 同時記錄原來的位置, 知道是否是一個整串
        1. 壓縮...留一些空間做常用查詢串的快取...
    ⑨再說怎麼優化這個預處理的排序過程. 每次讀5GB的資料進來, 算好hash分好桶, 這種OK吧, 然後按桶回寫到下去, 這裡也是批量寫的. 處理完繼續處理下一個5GB, 全部處理完後, 再做歸併, 搞幾輪後, 就OK了嘛. 當然, 為了把記憶體中排序時浪費的IO補回來, 可以 並行做, 一個在算的時候,另一個在讀....
  27. 10月12日,百度一面
    JAVA裡面的執行緒同步機制、異常處理機制、集合類、簡單的設計模式、hashmap和hashtable的區別,及HashMap和ConcurrentHashMap的區別。
    點評:關於hashmap和hashtable的區別,請看上文第13題,其餘請自己查閱相關書籍。
  28. stat、SDE、PM、DS等相關職位的面試題
    1、有一組資料,很長,有ID,經緯度,時間4個變數。
    怎麼找出兩人是否有一面之緣。怎麼找出所有relationship(定義是在100米範圍內一起度過1小時以上)。
    2、怎麼找出競爭對手購買了哪些搜尋關鍵詞。
    3、怎麼判斷兩個TB級別的文字是否雷同,是否近似。
    4、怎麼用C實現SQL的join功能。
    5、怎麼最快的在一個大文字里面搜尋字串。
    6、coding計算斐波那契數列。
    更多請參看:http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5ODIzNDQ3Mw==&appmsgid=10000300&itemidx=1&sign=173a62e0db86cb4c76a0bb1e9c22f3e5
  29. 10月12日,網易遊戲專業一面
      1、怎麼判斷單連結串列有沒有環
      2、怎麼判斷兩個無環單連結串列是否相交
      3、101個硬幣中有一個假幣,有一個無砝碼的天平,稱兩次,判斷假幣比真幣重還是輕。
    點評:老掉牙的題,沒點評的慾望,原文請看:http://blog.csdn.net/cqsctlsss/article/details/12747631
  30. 10月13日,百度筆試題:
    1、 給出陣列A={a_0,a_1,a_2,...,a_n}(n是可變的),列印出所有元素的組合
    2、 陣列A中任意兩個相鄰元素大小相差1,現給定這樣的陣列A和目標整數t,找出t在陣列A中的位置。
    3、 求二叉樹的面積(高乘寬),高為二叉樹根到葉子節點的最大距離,寬慰二叉樹最多的節點數。
    4、給了一個百度地圖的截圖,對於地圖上的某一點,需要在地圖上標註該點的資訊,將資訊抽象成一個矩形,可以在該點的左邊標記,也可以在該點右邊標記。但是任意兩點標記後的矩形是不能有覆蓋的,否則刪除其中一個點
        問題1,現給一固定區域,有n個點,設計一個演算法,要求標記足夠多的點
        問題2,當點足夠多時候,演算法會遇到效能瓶頸,需要對演算法重新優化。
    更多題目請參見:http://blog.csdn.net/xyanghomepage/article/details/12687771
  31. 騰訊筆試題兩道
    1、有100W個關鍵字,長度小於等於50位元組。用高效的演算法找出top10的熱詞,並對記憶體的佔用不超過1MB。
    點評:老題,與caopengcs討論後,得出具體思路為:
    ①先把100W個關鍵字hash對映到小檔案,根據題意,100W*50B = 50*10^6B = 50M,而記憶體只有1M,故乾脆搞一個hash函式 % 50,分解成50個小檔案;
    ②針對對每個小檔案依次運用hashmap(key,value)完成每個key的value次數統計,後用堆找出每個小檔案中value次數最大的top 10;
    ③最後依次對每兩小檔案的top 10歸併,得到最終的top 10。

    注:很多細節需要注意下,舉個例子,如若hash對映後導致分佈不均的話,有的小檔案可能會超過1M,故為保險起見,你可能會說根據資料範圍分解成50~500或更多的小檔案,但到底是多少呢?我覺得這不重要,勿糾結答案,雖準備在平時,但關鍵還是看臨場發揮,保持思路清晰關注細節即可。OK,更多類似題目參見此文:http://blog.csdn.net/v_july_v/article/details/7382693
    2、求二叉樹的任意兩個節點的最近公共祖先。
    點評:何謂最低公共祖先,如下圖所示:節點1和節點7的最低公共祖先便是5

    點評:此題看似簡單,實則不簡單,下面參考引用《Cracking the Coding Interview》一書上的解法:
    說簡單是因為如果這棵樹是二叉查詢樹,則最低公共祖先t必在兩個節點p和q的中間處,即p<t<q;
    說不簡單則是因為如果不是二叉查詢樹,則我們必須確定這棵樹的結點是否包含指向父結點的連線,如此:
    ①當包含指向父結點的連線時,如果每個結點都包含指向父結點的連線,我們就可以向上追蹤p和q的路徑,直至兩者相交。
    不過,這麼做可能不符合題目的若干假設,因為它需要滿足以下兩個條件之一:1)可將結點標記為isVisited;2)可用另外的資料結構如雜湊表儲存一些資料。
    ②不包含指向父結點的連線時,另一種做法是,順著一條p和q都在同一邊的鏈子,也就是說,若p和q都在某結點的左邊,就到左子樹中查詢共同祖先。
    若都在右邊,則在右子樹中查詢共同祖先。要是p和q不在同一邊,那就表示已經找到第一個共同祖先。
    這種做法的實現程式碼如下:
    1. /* 若p為root的子孫,則返回true */  
    2. boolean covers(TreeNode root, TreeNode p) {   
    3.     if (root == null) return false;  
    4.     if (root == p) return true;  
    5.     return covers(root.left, p) || covers(root.right, p);   
    6. }  
    7.   
    8. TreeNode commonAncestorHelper(TreeNode root, TreeNode p,   
    9.     TreeNode q) {  
    10.         if (root == null) return null;  
    11.         if (root == p || root == q) return root;  
    12.         boolean is_p_on_left = covers(root.left, p);  
    13.         boolean is_q_on_left = covers(root.left, q);  
    14.   
    15.         /* 若p和q不在同一邊,則返回root */  
    16.         if (is_p_on_left != is_q_on_left) return root;  
    17.         /* 否則就是在同一邊,遍訪那一邊 */  
    18.         TreeNode child_side = is_p_on_left ? root.left : root.right;  
    19.         return commonAncestorHelper(child_side, p, q);  
    20. }  
    21.   
    22. TreeNode commonAncestor(TreeNode root, TreeNode p, TreeNode q) {  
    23.     if (!covers(root, p) || !covers(root, q)) { // 錯誤檢查  
    24.         return null;  
    25.     }  
    26. return commonAncestorHelper(root, p, q);  
    27. }  
    但上述程式碼存在一些問題,讀者可以進一步思考,後續可能會在程式設計藝術系列裡詳細闡述,可保持關注。
    OK,其實本題是常見的Lowest Common Ancestor (LCA) 問題,更多分析可再看看這3篇文章:①http://eriol.iteye.com/blog/1170465;②http://zhedahht.blog.163.com/blog/static/25411174201081263815813/;③http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor。此外,關於二叉樹有很多面試題目,參見:http://blog.csdn.net/luckyxiaoqiang/article/details/7518888
  32. 10月13日,小米2014校招研發筆試-北京站
    2小時3道程式設計題
    Q1:給出一個int陣列,通過變換使得左邊全為奇數右邊全為偶數。
    Q2:給出一顆有序二叉樹,將它轉換為有序的雙向連結串列輸出。
    有序二叉樹形如:
              10
              /   \
            6     14
          /   \    /    \
        4    8 12  16
    雙向連結串列形如:
    4=6=8=10=12=14=16
    Q3:字串的四則運算。給出一個字串,包含0~9的數字和+-*/()的運算子,-僅代表減號不代表負數。舉例如下:
    輸入:1+2*(3-4)
    輸出:-1.
    參考分析見:http://www.itmian4.com/forum.php?mod=viewthread&tid=3713
  33. 10月13日,百度深度學習演算法研發工程師筆試題
    一、簡答題
        1.深度神經網路目前有哪些成功的應用?簡述原因。(10分)
        2.列舉不同程式共享資料的方式(至少三種)。(10分)
        3.對於N個樣本,每個樣本為D維向量,採用歐式距離使用KNN做類預測。(10分)
    1).給出預測時間複雜度。
    2).當N很大時,有哪些方法可以降低複雜度?
    3).k取值的大小對預測方差和偏差有何影響?
    二、演算法和程式設計
        1.給出一個資料A=[a_0, a_1, a-2, ... a_n](其中n可變),列印出該數值元素的所有組合。(15分) 
        2.有這樣一個陣列A,大小為n,相鄰元素差的絕對值都是1,如A={4,5,6,5,6,7,8,9,10,9}。現在給定陣列A和目標整數t,請找到t在陣列中的位置。(15分) 
        3.在平面上有一組間距為d的平行線,將一根長度為l(l<d)的針任意擲在這個平面上,求此針與平行線中任意一根相交的概率,用高等數學(微積分、概率的方法)求解,基於布豐投針的結論,任選一種程式語言(C/C++, matlab, python, java),寫出模擬投針實驗(程式中允許把一個理想的Pi作為常量使用),求解圓周率。(15分)
    三、系統設計題

    2.關於K-means聚類演算法,請回答以下問題:
        1).寫出將N個樣本X=(x1, ... xN)聚類成k類的k_means聚類演算法的優化目標;
        2).描述K-means終止的常用條件;
        3).以Kmeans演算法為例,描述Expectation-Maximization(EM)演算法的基本原理與步驟。
        4).用虛擬碼給出基於MPI或者HADOOP的Kmeans並行演算法。
    題目來源:http://blog.csdn.net/luoweifu/article/details/12685169
  34. 10月13日,百度2014校招移動研發筆試題
    一.簡答題
      1.簡述計算機的儲存系統分為哪幾個層次,為什麼這樣的分層能夠提高程式的執行效率。
      2.浮點數在計算中如何表示,如何對浮點數判等。
      3.簡述TCP與UDP協議的差別,兩者與HTTP的關係。並列舉HTTP的方法,以及常見的返回狀態碼。
    二.演算法與程式設計
      1.設計一個反轉字串的函式 char *reverse_str(char *str),不使用系統函式。
      2.給定一個字串,(1,(2,3),(4,(5,6),7)),使它變為(1,2,3,4,5,6,7),設計一個演算法消除其中巢狀的括號。(c/c++)
      3.使用C語言實現htonl(將long性轉為網路位元組碼),不使用系統自帶函式。
    三.系統設計題
    物件導向是一種思想,使用C語言來實現下列問題。
      1.如何定義一個類?
      2.如何建立以及銷燬物件?
      3.如何實現類的繼承?
    題目來源:http://blog.csdn.net/cocoarannie/article/details/12691025
  35. 10月14日,歡聚時代YY-2014校招軟體研發筆試題

    點評:類似上面第1題跟海量資料相關的筆試面試題,看這一篇文章即夠:http://blog.csdn.net/v_july_v/article/details/7382693。更多題目請參見:http://blog.csdn.net/Arcsinsin/article/details/12714027
  36. 輸入一個整形陣列,陣列裡有正數也有負數。陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。求所有子陣列的和的最大值。要求時間複雜度為O(n)。
    例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10, -4, 7, 2,因此輸出為該子陣列的和18。
    點評:求子陣列的最大和這個問題,在本部落格內的程式設計藝術系列第7章:http://blog.csdn.net/v_JULY_v/article/details/6444021 已有詳細闡述,但那畢竟只是針對一維陣列,如果陣列是二維的呢?

    如果 “子陣列” 並不只是一個二維陣列或矩形,而是聯通的元素(上下或左右相鄰即視為聯通)呢?

    再言之,如果是個輪胎呢?嘻

    上述這些問題來源於鄒欣老師的部落格:http://www.cnblogs.com/xinz/p/3318230.html。而且事實上,去年本部落格內也同樣整理過這幾個問題,如此文第22題:http://blog.csdn.net/v_july_v/article/details/6855788
  37. 給平面上的2n個點,怎麼找一個圓包含其中的n個點?
  38. 10月17日,微策略2014校招筆試
    1. coding判定二叉樹是否是有序二叉樹
    2. 一個有序陣列A(buffer足夠大),和一個有序陣列B,設計演算法,merge兩個陣列後有序,不使用任何額外的記憶體空間。
    3. 100個點燈問題,初始狀態都是OFF,進行1000次試驗,第x次,按動一下能被x整除,計算最終的狀態是ON的點燈編號。Coding實現,設計兩種方案,並分析時間、空間複雜度
    4. Web, css3中 visibility="hide"(頁面保留空間) 與 display="none"(頁面不保留空間)有何區別?一般元素選擇器有哪些?
       Padding, margin, height, width在圖形中指什麼?
    一個乾淨的、輕量級的標籤以及 結構與表現更好的分離,高階選擇器是非常有用的。
    Class選擇器
    Id選擇器
    屬性選擇器 [arr = xx] [att *= xx] [att ^=xx] [att $= xx]
    偽選擇器 first after before
    5. Web效能改進方面的10個提議:涉及圖片、js、css、client, server
    6. 數字遊戲:桌子上有數值為Number的數字,2個玩家,每個玩家可以選擇減去有 Number中連續1,2,,,,位構成的數值,桌子上換成差值,迴圈下去。提出演算法:第一個玩家應該怎麼減去桌子上的數值,如果第一個玩家輸,返回-1
    7. 交換單連結串列中兩個指標(提示不能直接互動單連結串列中值)
  39. 讀者@fhljys留言提供:百度一面試題
    磁碟裡有100T的資料,每一個資料項有一個Key,資料項按key的升序排列,但是key不連續。每個資料項的大小不一樣,但是都不超過1M,每一個資料項以特定的識別符號結束。現在記憶體大小為256M,如何找到指定Key的資料項。
    點評:具體思路就是二分查詢,更多討論請見:http://weibo.com/1580904460/AeVSDCdac?mod=weibotime
  40. 10月17日,新浪2014校招應用開發筆試題
  41. 10月17日,360校招測試開發一面
    1、寫一個單例模式
    2、怎麼樣對一個hashmap裡的<key,value>根據key進行排序?
    3、給出一個路徑“D/test/test.txt”,其中記錄了一個搜尋結果“百度,關鍵詞,結果1-10,360,關鍵詞,結果1-10”,用程式實現把這兩個搜尋結果中出現相同關鍵詞的搜尋結果存入另一個檔案中。
    4、對一個陣列中找出第二大的數
    5、TCP的三次握手是怎樣的過程,如果是兩次握手會怎麼樣,四次握手呢?
  42. 美團2014校招二面
    假設已有10w個敏感詞,現給你50個單詞,查詢這50個單詞中是否有敏感詞。
    點評:換句話說,題目要你判斷這50個單詞是否存在那10w個敏感詞庫裡,明顯是字串匹配,由於是判斷多個單詞不是一個,故是多模式字串匹配問題,既是多模式字串匹配問題,那麼便有一類稱之為多模式字串匹配演算法,而這類演算法無非是kmp、hash、trie、AC自動機、wm等等:http://stblog.baidu-tech.com/?p=418
    那到底用哪種演算法呢?這得根據題目的應用場景而定。10w + 50,如果允許誤差的話,你可能會考慮用布林過濾器;否則,只查一次的話,可能hash最快,但hash消耗空間大,故若考慮tire的話,可以針對這10w個敏感詞建立trie樹,然後對那50個單詞搜尋這顆10w敏感詞構建的tire樹,但用tire樹同樣耗費空間,有什麼更好的辦法呢?Double Array Trie麼?請讀者繼續思考。
  43. 谷歌面試題:輸入是兩個整數陣列,他們任意兩個數的和又可以組成一個陣列,求這個和中前k個數怎麼做?
    點評:引用朋友Ben部落格http://blog.csdn.net/tnndye/article/details/12857577 內的分析,假設兩個整數陣列為A和B,各有N個元素,任意兩個數的和組成的陣列C有N^2個元素。
           那麼可以把這些和看成N個有序數列:
                  A[1]+B[1] <= A[1]+B[2] <= A[1]+B[3] <=…
                  A[2]+B[1] <= A[2]+B[2] <= A[2]+B[3] <=…
                  …
                 A[N]+B[1] <= A[N]+B[2] <= A[N]+B[3] <=…
            問題轉變成,在這N個有序數列裡,找到前k小的元素http://blog.csdn.net/v_JULY_v/article/details/6370650
  44. 阿里巴巴二面:
    兩個字串A、B。從A中剔除存在於B中的字元。比如A=“hello world”,B="er",那麼剔除之後A變為"hllowold"。空間複雜度要求是O(1),時間複雜度越優越好。
    點評:微博上一朋友@kanrence留言到:把B對應的字元在asc碼錶上置1,然後掃描A,表上置1的就A上刪掉。或者如@齊士博Go所說asc的bitvector, O(m+n); 先把B對映到vecotr,再遍歷A。這兩種方法因為都是常數空間127,所以可以認為是空間複雜度O(1),此外,還有別的什麼方法麼?位運算?更多討論請見這:http://weibo.com/1580904460/AeNifo3tI?mod=weibotime
  45. 創新工場面試
    1、有一個int型陣列,每兩個相鄰的數之間的差值不是1就是-1.現在給定一個數,要求查詢這個數在陣列中的位置。
    2、一個字元陣列,裡面的字元可能是a-z、A-Z、0-9.現在要求對陣列進行排序,要求所有小寫字元放在最前面,所有大寫字元放在中間,所有數字放在最後,而且各部分內部分別有序。
    點評:面試中紙上coding能力尤為重要,且答題之前一定要跟面試官交流以徹底弄清楚題意,題目來源:http://blog.csdn.net/xiajun07061225/article/details/8882981
  46. 10月17日,網易2014校招雷火遊戲一面
    1、i)
    1. Class A{  
    2. ...  
    3. };  
    4. A *pa = new A();  
    5. A *pas = new A[NUM]();  
    6.   
    7. 1.delete []pas;                //詳細流程  
    8. 2.delete []pa;                //會發生什麼  
    9. 3.delete pas;                //哪些指標會變成野指標  
    ii)、為什麼不建議經常手動new和delete而以記憶體池取代
    iii)、malloc函式本身涉及的幾種系統呼叫
    iv)、記憶體分配演算法夥伴演算法
    整理自:http://www.itmian4.com/forum.php?mod=viewthread&tid=3753
  47. 10月21日,唯品會2014校招南京站-資料探勘與分析崗位筆試題目


    來源:http://www.itmian4.com/forum.php?mod=viewthread&tid=3770
  48. 2013巨人網路筆試題
    1、雙向連結串列
    用C++實現一個雙向連結串列(元素型別為int),需支援
      a、兩個連結串列之間的深拷貝
      b、兩個連結串列的拼接
      c、從連結串列頭插入/刪除元素
      d、查詢連結串列中的某個元素
      e、返回連結串列中指定下標的元素
    2、影像旋轉90度;上下行互換
    其餘題目參見:http://www.itmian4.com/forum.php?mod=viewthread&tid=3777
  49. 10月21日,微策略MicroStrategy2014校招聘面試題
    1、判斷一個字串是否迴文
    2、如何快速找出一個有序陣列中a=i的那個元素
    3、p是素數,p>=3,證明p(p^2-1)能被24整除
    來源:http://www.itmian4.com/forum.php?mod=viewthread&tid=3780
  50. 騰訊2014校招筆試題-廣州站
    簡單題
    1 請設計一個排隊系統,能夠讓每個進入隊伍的使用者都能看到自己在佇列中所處的位置和變化,隊伍可能隨時有人加入和退出;當有人退出影響到使用者的位置排名時需要及時反饋到使用者。
    2 A,B兩個整數集合,設計一個演算法求他們的交集,儘可能的高效。
    其餘題目參見:http://www.itmian4.com/forum.php?mod=viewthread&tid=3788
  51. 網易2014校園招聘杭州Java筆試題http://blog.csdn.net/hxz_qlh/article/details/13168267
  52. 2014小米研發筆試(南京站)http://blog.csdn.net/thyftguhfyguj/article/details/13161339
  53. 10月26日,2014年騰訊校園招聘技術類筆試題(杭州站) http://www.itmian4.com/forum.php?mod=viewthread&tid=3802&extra=page%3D1
  54. 10月19日,合合資訊科技-校園招聘筆試題

    點評:上述第3題即為程式設計藝術第二章,見http://blog.csdn.net/v_JULY_v/article/details/6347454
  55. 10月29日,奇虎360校招面試,一堆的基礎題,詳見:http://blog.csdn.net/wangyf101/article/details/14048333
  56. 10月30日, UC2014校園招聘技術類筆試題

    有無OJ的ID,或github的賬號,或技術部落格地址?
    點評:快排實現見此文http://blog.csdn.net/v_JULY_v/article/details/6262915。更多題目見:http://blog.csdn.net/lujingbiao/article/details/13510299
  57. 10月31日,58同城2014校園招聘筆試題

    點評:著實沒想到,58同城於2013年10月31日在紐約上市了,恭喜!畢竟他們的老總姚金波也是我湖南人。記得之前去這家公司面試過,面試官很好,即便一時半會答不上來,他也會耐心引導你一起思考,可惜的是最後跟人事談待遇的時候,不給一點餘地,所以,直接拒掉了,如果現在再面一次,人事還是那般,依然會再拒一次:-)。但,儘管如此,58還是值得朋友們選擇。OK,更多題目見:http://blog.csdn.net/Hedy20120808/article/details/13766781
  58. Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order。一句話,即為螺旋矩陣問題。
    舉個例子,給定如下的一個矩陣:
    [
     [ 1, 2, 3 ],
     [ 4, 5, 6 ],
     [ 7, 8, 9 ]
    ]
    你應該返回:[1,2,3,6,9,8,7,4,5]。如下圖所示,遍歷順序為螺旋狀:

    以下是一份參考程式碼:
    1. class Solution {    
    2. public:    
    3.     vector<int> spiralOrder(vector<vector<int> >& matrix) {    
    4.         vector<int> result;    
    5.         if (matrix.empty()) return result;    
    6.         ssize_t beginX = 0, endX = matrix[0].size() - 1;    
    7.         ssize_t beginY = 0, endY = matrix.size() - 1;    
    8.   
    9.         while (true) {    
    10.             // From left to right    
    11.             for (ssize_t i = beginX; i <= endX; ++i)    
    12.                 result.push_back(matrix[beginY][i]);    
    13.             if (++beginY > endY) break;    
    14.   
    15.             // From top down    
    16.             for (ssize_t i = beginY; i <= endY; ++i)    
    17.                 result.push_back(matrix[i][endX]);    
    18.             if (beginX > --endX) break;    
    19.   
    20.             // From right to left    
    21.             for (ssize_t i = endX; i >= beginX; --i)    
    22.                 result.push_back(matrix[endY][i]);    
    23.             if (beginY > --endY) break;    
    24.   
    25.             // From bottom up    
    26.             for (ssize_t i = endY; i >= beginY; --i)    
    27.                 result.push_back(matrix[i][beginX]);    
    28.             if (++beginX > endX) break;    
    29.         }    
    30.         return result;    
    31.     }    
    32. };    
    程式碼來源leetcode:http://discuss.leetcode.com/questions/29/spiral-matrix
  59. 待續,11月5日中午..


後記

    有一點想不遺餘力的特別強調:如果你是找軟體開發相關的職位,那麼基礎第一,其次便是coding能力是否過硬,此決定你有多少資本/薪水/是在國內還是國外,最後才是演算法,希望勿本末倒置。不少人總是有意無意忽視coding,以為雖coding能力一般,但演算法好,抱有此種僥倖心理的最後都會發現得不償失。不具備基本程式設計能力的人,永遠無法真正邁進軟體開發領域。

    再者,算上今年,本部落格已經連續整理了4個年頭的筆試面試題,從這些筆試面試題中,細心的朋友自會發現,每一年校招的很多程式設計題屢屢都是程式設計藝術系列上的原題,故我希望大家掌握的是一類題目的方法,而不是糾結於某一道題的標準答案。

    正因為方法比答案重要,所以程式設計藝術系列從最容易想到的思路開始講起,一步步優化,而不是其它題解那樣一上來就給你所謂的標準速成答案,面試亦如此。

    最後,除了程式設計師程式設計藝術系列外,再推薦一些資料、書籍和講座給大家,供大家參考:

  1. 程式設計師程式設計藝術http://blog.csdn.net/column/details/taopp.html
  2. 秒殺99%的海量資料處理面試題http://blog.csdn.net/v_july_v/article/details/7382693
  3. 微軟面試100題系列http://blog.csdn.net/column/details/ms100.html
  4. 《程式設計之美》;
  5. 《劍指offer》;
  6. 《Cracking the Coding Interview: 150 Programming Questions and Solutions》,順便貼個此本書的題解:http://hawstein.com/posts/ctci-solutions-contents.html且其中文版《程式設計師面試金典》即將由圖靈教育出版社出版
  7. 我個人舉辦的專為幫助大家找工作的面試&演算法講座http://blog.csdn.net/v_july_v/article/details/7237351#t26
  8. 一個刷面試題的leetcode:http://leetcode.com/,順便附帶一個leetcode的題解供參考https://github.com/soulmachine/leetcode
  9. 程式設計師面試網站careercup:http://www.careercup.com/
  10. 一個IT面試論壇:http://www.itmian4.com/
  11. 友人@陳利人 維護的一面試相關的微信公眾賬號“待字閨中”。
    有何見解或思路,歡迎隨時評論於本文之下,或show me your code!感謝。

相關文章