十月上旬百度,阿里巴巴,迅雷搜狗最新面試七十題(第201-270題)

idaretobe發表於2015-01-13

http://blog.csdn.net/myblog_dwh/article/details/16973827

 十月百度,阿里巴巴,迅雷搜狗最新面試七十題(第201-270題)

引言

   當即早已進入10月份,十一過後,招聘,筆試,面試,求職漸趨火熱。而在這一系列過程背後浮出的各大IT公司的筆試/面試題則蘊含著諸多思想與設計,細細把玩,思考一番亦能有不少收穫。

    上個月,本部落格著重整理九月騰訊,創新工場,淘寶等公司最新面試十三題,此次重點整理百度,阿里巴巴,迅雷和搜尋等公司最新的面試題。同上篇一樣,答案望諸君共同討論之,個人亦在慢慢思考解答。多謝。

最新面試十一題

  1. 十月百度:一個陣列儲存了N個結構,每個結構儲存了一個座標,結構間的座標都不相同,請問如何找到指定座標的結構(除了遍歷整個陣列,是否有更好的辦法)?(要麼預先排序,二分查詢。要麼雜湊。hash的話,座標(x,y)你可以當做一個2位數,寫一個雜湊函式,把(x,y)直接轉成“(x,y)”作為key,預設用string比較或如Edward Lee所說,將座標(x, y)作為 Hash 中的 key。例如(m, n),通過 (m,n) 和 (n, m) 兩次查詢看是否在 HashMap 中。也可以在儲存時就規定 (x, y) , x < y ,在插入之前做個判斷。
  2. 百度最新面試題:現在有1千萬個隨機數,隨機數的範圍在1到1億之間。現在要求寫出一種演算法,將1到1億之間沒有在隨機數中的數求出來。(程式設計珠璣上有此類似的一題,如果有足夠的記憶體的話可以用點陣圖法,即開一個1億位的bitset,記憶體為100m/8== 12.5m, 然後如果一個數有出現,對應的bitset上標記為1,最後統計bitset上為0的即可。)
  3. Alibaba筆試題:給定一段產品的英文描述,包含M個英文字母,每個英文單詞以空格分隔,無其他標點符號;再給定N個英文單詞關鍵字,請說明思路並程式設計實現方法
        String extractSummary(String description,String[] key words)
    目標是找出此產品描述中包含N個關鍵字(每個關鍵詞至少出現一次)的長度最短的子串,作為產品簡介輸出。(不限程式語言)20分。(掃描過程始終保持一個[left,right]的range,初始化確保[left,right]的range裡包含所有關鍵字則停止。然後每次迭代:
    1,試圖右移動left,停止條件為再移動將導致無法包含所有關鍵字。
    2,比較當前range's length和best length,更新最優值。
    3,右移right,停止條件為使任意一個關鍵字的計數+1。
    4,重複迭代。
    程式設計之美有最短摘要生成的問題,與此問題類似,讀者可作參考。
  4. 搜狗:有N個正實數(注意是實數,大小升序排列) x1 , x2 ... xN,另有一個實數M。 需要選出若干個x,使這幾個x的和與 M 最接近。 請描述實現演算法,並指出演算法複雜度(參考第五章、尋找滿足條件的兩個或多個數)。
  5. 迅雷:給你10臺機器,每個機器2個cpu,2g記憶體,現在已知在10億條記錄的資料庫裡執行一次查詢需要5秒,問用什麼方法能讓90%的查詢能在100毫秒以內返回結果。(@geochway:將10億條記錄排序,然後分到10個機器中,分的時候是一個記錄一個記錄的輪流分,
    確保每個機器記錄大小分佈差不多,每一次查詢時,同時提交給10臺機器,同時查詢,
    因為記錄已排序,可以採用二分法查詢。
    如果無法排序,只能順序查詢,那就要看記錄本身的概率分佈,否則不可能實現。
    一個機器2個CPU未必能起到作用,要看這兩個CPU能否並行存取記憶體,取決於系統架構
    。)
  6. 給定一個函式rand()能產生0到n-1之間的等概率隨機數,問如何產生0到m-1之間等概率的隨機數?
  7. 騰訊:五筆的編碼範圍是a ~ y的25個字母,從1位到4位的編碼,如果我們把五筆的編碼按字典序排序,形成一個陣列如下:
        a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy
    其中a的Index為0,aa的Index為1,aaa的Index為2,以此類推。
    1)編寫一個函式,輸入是任意一個編碼,比如baca,輸出這個編碼對應的Index;
    2)編寫一個函式,輸入是任意一個Index,比如12345,輸出這個Index對應的編碼。
  8. 2011.10.09百度筆試題(下述第8-12題):linux/unix遠端登陸都用到了ssh服務,當網路出現錯誤時服務會中斷,linux/unix端的程式會停止。為什麼會這樣?說下ssh的原理,解釋中斷的原理。
  9. 一個最小堆,也是完全二叉樹,用按層遍歷陣列表示。
      1.  求節點a[n]的子節點的訪問方式
      2.  插入一節點的程式void add_element(int *a,int size,int val);
      3.  刪除最小節點的程式。
  10. a)求一個全排列函式:如p([1,2,3]) ,輸出:  [123],[132],[213],[231],[321],[323]。
    b)求一個組合函式:    如p([1,2,3]) ,輸出:[1],[2],[3],[1,2],[2,3],[1,3],[1,2,3]。
    這兩問可以用虛擬碼(全排列請參考這裡的第67題:微軟、Google等公司非常好的面試題及解答[第61-70題] )。
  11. 有這樣一種編碼:如,N=134,M=f(N)=143,N=020,M=fun(N)=101,其中N和M的位數一樣,N,M可以均可以以0開頭,N,M的各位數之和要相等,即1+3+4=1+4+3,且M是大於N中最小的一個,
    現在求這樣的序列S,N為一個定值,其中S(0)=N,S(1)=fun(N),S(2)=fun(S(1))。
  12. 有1000萬條URL,每條URL 50位元組,只包含主機字首,要求實現URL提示系統:
    (1)要求實時更新匹配使用者輸入的地址,每輸出一個字元,輸出最新匹配URL
    (2)每次只匹配主機字首,例如對 www.abaidu.comwww.baidu.com,使用者輸入www.b時只提示www.baidu.com(3)每次提供10條匹配的URL
    (4)以使用者需求為主。
  13. 海量記錄,記錄形式如下: TERMID URLNOCOUNT urlno1 urlno2   ..., urlnon  
    怎麼考慮資源和時間這兩個因素,實現快速查詢任意兩個記錄的交集,並集等,設計相關的資料結構和演算法。
  14. 百度最新筆試題(感謝xiongyangwan提供的題目):利用互斥量和條件變數設計一個訊息佇列,具有以下功能:
       1 建立訊息佇列(訊息中所含的元素)
       2 訊息佇列中插入訊息
       3 取出一個訊息(阻塞方式)
       4 取出第一訊息(非阻塞方式)
  15. 百度移動終端研發筆試:系統設計題(40分)
    對已排好序的陣列A,一般來說可用二分查詢可以很快找到。現有一特殊陣列A[],它是迴圈遞增的,如A[]={ 17 19 20 25 1 4 7 9},試在這樣的陣列中找一元素x,看看是否存在。
    請寫出你的演算法,必要時可寫虛擬碼,並分析其空間、時間複雜度。
  16. #include<stdio.h>
    #include <string.h>
    void main()
    {
     int a[2000];
     char *p = (char *)a;
     int i ;
     for( i = 0; i < 2000; i++)
      a[i] = -i -1;
     printf("%d\n", strlen(p));
    }
    寫出輸出結果
    onlyice:i = FFFFFF00H 的時候,才有'\0'出現,就是最後一個位元組,C風格字串讀到'\0'就終止了。FFFFFF00H 是 -256,就是 i 的值為255時a[i] = FFFFFF00H ....
  17. 騰訊10.09測試筆試題:有N+2個數,N個數出現了偶數次,2個數出現了奇數次(這兩個數不相等),問用O(1)的空間複雜度,找出這兩個數,不需要知道具體位置,只需要知道這兩個值。(@Rojay:xor一次,得到2個奇數次的數之和x。第二步,以x(展開成二進位制)中有1的某位(假設第i位為1)作為劃分,第二次只xor第i位為1的那些數,得到y。然後x xor y以及y便是那兩個數。 
  18. @well:一個整數陣列,有n個整數,如何找其中m個數的和等於另外n-m個數的和?(與上面第4題類似,參考:第五章、尋找滿足條件的兩個或多個數)。
  19. 阿里雲筆試題:一個HTTP伺服器處理一次請求需要500毫秒,請問這個伺服器如何每秒處理100個請求。
  20. 今天10.10阿里雲筆試@土豆:1、三次握手;2、死鎖的條件。互斥條件(Mutual exclusion):1、資源不能被共享,只能由一個程式使用。2、請求與保持條件(Hold and wait):已經得到資源的程式可以再次申請新的資源。3、非剝奪條件(No pre-emption):已經分配的資源不能從相應的程式中被強制地剝奪。4、迴圈等待條件(Circular wait):系統中若干程式組成環路,該環路中每個程式都在等待相鄰程式正佔用的資源。處理死鎖的策略1.忽略該問題。例如鴕鳥演算法,該演算法可以應用在極少發生死鎖的的情況下。為什麼叫鴕鳥演算法呢,因為傳說中鴕鳥看到危險就把頭埋在地底下,可能鴕鳥覺得看不到危險也就沒危險了吧。跟掩耳盜鈴有點像。2.檢測死鎖並且恢復。3.仔細地對資源進行動態分配,以避免死鎖。4.通過破除死鎖四個必要條件之一,來防止死鎖產生。
  21. 微軟2011最新面試題(以下三題,第22、23、24題皆摘自微軟亞洲研究院的鄒欣老師部落格):瀏覽過本人的程式設計師程式設計藝術系列的文章,一定對其中的這個問題頗有印象:第七章、求連續子陣列的最大和。求陣列最大子陣列的和最初來源於程式設計之美,image。我在程式設計藝術系列中提供了多種解答方式,然而這個問題若擴充套件到二維陣列呢?再者,若陣列首尾相連, 像一個輪胎一樣, 又怎麼辦呢?聰明的同學還是給出了漂亮的答案, 並且用 SilverLight/WPF 給畫了出來, 如下圖所示:

    好,設想現在我們有一張紙帶,兩面都寫滿了像如上第一幅圖那樣的數字, 我們把紙帶的一端扭轉, 和另一端接起來, 構成一個莫比烏斯環 (Möbius Strip,如將一個長方形紙條ABCD的一端AB固定,另一端DC扭轉半周後,把AB和CD粘合在一起 ,得到的曲面就是麥比烏斯圈,也稱莫比烏斯帶。),如下圖所示:

    如上,儘管這個紙帶扭了一下,  但是上面還是有陣列, 還是有最大子陣列的和,對麼? 在求最大子陣列的和之前, 我們用什麼樣的資料結構來表示這些數字呢? 你可以用 Java, C, C#, 或其他語言的資料結構來描述這個莫比烏斯環上的陣列。資料結構搞好了, 演算法自然就有了。(@風大哥:莫比烏斯帶,用環形陣列或者連結串列可以表示。環型陣列的話,1-N,到N特殊處理一下,連到1就是環型陣列了,一個紙帶上正反兩面各有N個數,A1...An,B1...Bn,那麼就可以構造一個新的陣列:A1-An-B1-Bn.訪問到Bn下一位就是A1,就是環形的陣列了。從某個位置k開始,用i,j向一個方向遍歷,直到i到達k位置,或者i=j,被追上,用陣列需要一點技巧,就是J再次過k需要打個標誌,以便計算終止條件和輸出。當然,如果用連結串列就更簡單了。把連結串列首尾相接即可,即An執行B1,Bn指向A1即可。)  

  22. 《程式設計之美》的第一題是讓Windows 工作管理員的CPU 使用率曲線畫出一個正弦波。我一直在想, 能不能把CPU 使用率邊上的網路使用率也如法炮製一下呢?  比如, 也來一個正弦曲線?
  23. 如果你沒看過, 也至少聽說<人月神話>  (The Mythical Man-month) 這本在軟體工程領域很有影響的書.  當你在微軟學術搜尋中輸入 “manmonth” 這個詞的時候, 你會意外地碰到下面這個錯誤:

    經過幾次試驗之後, 你發現必須要輸入 “man-month” 才能得到希望的結果。 這不就是隻差一個  ‘-’ 符號麼?  為什麼這個搜尋引擎不能做得聰明一些, 給一些提示 (Query Suggestion)? 或者自動把使用者想搜的結果展現出來 (Query Alteration)?   我們在輸入比較長的英文單詞的時候, 也難免會敲錯一兩個字母, 網站應該幫助使用者, 而不是冷冰冰地拒絕使用者啊。

    微軟的學術搜尋 (Microsoft Academic Search) 索引了超過 3千萬的文獻,  2 千萬的人名, 怎麼能以比較小的代價, 對經常出現的輸入錯誤提供提示? 或直接顯示相關結果, 避免使用者反覆嘗試輸入的煩惱?  

    你可能會說, 這很難吧,   但是另一家搜尋引擎似乎輕易地解決了這個問題 (谷歌,讀者可以一試)。 所以, 還是有辦法的。

    這個題目要求你:
     1) 試驗不同的輸入, 反推出目前微軟的學術搜尋是如何實現搜尋建議 (Query Suggestion)的。
     2) 提出自己的改進建議,  並論證這個解決方案在千萬級資料規模上能達到 “足夠好” 的時間 (speed) 和空間 (memory usage)效率。
     3) 估計這事需要幾個 人·月 (man-month) 才能做完?  (備註:順便給鄒欣老師傳個話,如果應屆畢業生可以能做好上述全部三個題目,便可直接找他。http://www.cnblogs.com/xinz/archive/2011/10/10/2205232.html)。

  24. 今天10.10阿里雲部分筆試題目:
    1、一個樹被序列化為陣列,如何反序列化。
    2、如何將100百萬有序資料最快插入到STL的map裡。
    3、有兩個執行緒a、b分別往一條佇列push和pop資料,在沒有鎖和訊號量的情況下如何避免衝突訪問。
    4、寫一個函式,功能是從字串s中查詢出子串t,並將t從s中刪除。
  25. 將長度為m和n的兩個升序陣列複製到長度為m+n的陣列裡,升序排列。
  26. tencent2012筆試題附加題
    問題描述: 例如手機朋友網有n個伺服器,為了方便使用者的訪問會在伺服器上快取資料,因此使用者每次訪問的時候最好能保持同一臺伺服器。
    已有的做法是根據ServerIPIndex[QQNUM%n]得到請求的伺服器,這種方法很方便將使用者分到不同的伺服器上去。但是如果一臺伺服器死掉了,那麼n就變為了n-1,那麼ServerIPIndex[QQNUM%n]與ServerIPIndex[QQNUM%(n-1)]基本上都不一樣了,所以大多數使用者的請求都會轉到其他伺服器,這樣會發生大量訪問錯誤。

    問: 如何改進或者換一種方法,使得:
    (1)一臺伺服器死掉後,不會造成大面積的訪問錯誤,
    (2)原有的訪問基本還是停留在同一臺伺服器上;
    (3)儘量考慮負載均衡。(思路:往分散式一致雜湊演算法方面考慮。關於此演算法,可參見此文:http://blog.csdn.net/21aspnet/article/details/5780831

  27.  騰訊面試題:A.txt和B.txt兩個檔案,A.txt有1億個QQ號 , B.txt  100W個QQ號, 用程式碼實現交、並、差。

  28.  說出下面的執行結果
    #include <iostream>
    using namespace std;

    class A
    {
    public:
        virtual void Fun(int number = 10)
        {
            std::cout << "A::Fun with number " << number<<endl;
        }
    };

    class B: public A
    {
    public:
        virtual void Fun(int number = 20)
        {
            std::cout << "B::Fun with number " << number<<endl;
        }
    };

    int main()
    {
        B b;
        A &a = b;
        a.Fun();
     return 0;
    }                 //虛擬函式動態繫結=>B,非A,預設實參是編譯時候確定的=>10,非20 。

  29.  今晚阿里雲筆試:有101根電線 每根的一頭在樓底  另一端在樓頂  有一個燈泡 一個電池 無數根很短的電線  怎麼樣在樓上一次在樓下去一次將電線的對應關係弄清楚。

  30. 金山筆試題:
     1、C ++為什麼經常將解構函式宣告為虛擬函式?
     2、inline和#define的如何定義MAX,區別是什麼。
     3、const的用法,如何解除const限制。
     4、智慧指標的作用和設計原理。
     5、STL中vetor如何自己設計,關鍵設計點,函式宣告,自定義刪除重複元素的函式。
     6、如何用一條SQL語句,刪除表中某欄位重複的記錄。
  31.  淘寶:

    在現代web服務系統的設計中,為了減輕源站的壓力,通常採用分散式快取技術,其原理如下圖所示,前端的分配器將針對不同內容的使用者請求分配給不同的快取伺服器向使用者提供服務。
                   分配器
          /             |         \
    快取         快取 . ..快取
    伺服器1 伺服器2 ...伺服器n

     1)請問如何設定分配策略,可以保證充分利用每個快取伺服器的儲存空間(每個內容只在一個快取伺服器有副本)
     2)當部分快取伺服器故障,或是因為系統擴容,導致快取伺服器的數量動態減少或增加時,你的分配策略是否可以保證較小的快取檔案重分配的開銷,如果不能,如何改進?
     3)當各個快取伺服器的儲存空間存在差異時(如有4個快取伺服器,儲存空間比為4:9:15:7),如何改進你的策略,按照如上的比例將內容排程到快取伺服器?(思路:往memcached或者一致性hash演算法方面考慮,但具體情況,具體分析。)

  32.  騰訊:50個臺階,一次可一階或兩階,共有幾種走法(老掉牙的題了,詳見微軟面試100題2010版。

    long long Fibonacci_Solution1(unsigned int n)
    {
          int result[2] = {0, 1};
          if(n < 2)
                return result[n];

          return Fibonacci_Solution1(n - 1) + Fibonacci_Solution1(n - 2);
    })。

  33.  有兩個float型的數,一個為fmax,另一個為fmin,還有一個整數n,如果 (fmax - fmin)/n ,不能整除,怎麼改變fmax,fmin,使改變後可以整除n 。

  34.  2011.10.11最新百度電面:
     1、動態連結庫與靜態連結庫的區別(  靜態連結庫是.lib格式的檔案,一般在工程的設定介面加入工程中,程式編譯時會把lib檔案的程式碼加入你的程式中因此會增加程式碼大小,你的程式一執行lib程式碼強制被裝入你程式的執行空間,不能手動移除lib程式碼。
      動態連結庫是程式執行時動態裝入記憶體的模組,格式*.dll,在程式執行時可以隨意載入和移除,節省記憶體空間。
      在大型的軟體專案中一般要實現很多功能,如果把所有單獨的功能寫成一個個lib檔案的話,程式執行的時候要佔用很大的記憶體空間,導致執行緩慢;但是如果將功能寫成dll檔案,就可以在用到該功能的時候呼叫功能對應的dll檔案,不用這個功能時將dll檔案移除記憶體,這樣可以節省記憶體空間
    。)
     2、指標與引用的區別(相同點:1. 都是地址的概念;
    指標指向一塊記憶體,它的內容是所指記憶體的地址;引用是某塊記憶體的別名。

    區別
    1. 指標是一個實體,而引用僅是個別名;
    2. 引用使用時無需解引用(*),指標需要解引用;
    3. 引用只能在定義時被初始化一次,之後不可變;指標可變;
    4. 引用沒有 const,指標有 const;
    5. 引用不能為空,指標可以為空;
    6. “sizeof 引用”得到的是所指向的變數(物件)的大小,而“sizeof 指標”得到的是指標本身(所指向的變數或物件的地址)的大小;
    7. 指標和引用的自增(++)運算意義不一樣;
    8.從記憶體分配上看:程式為指標變數分配記憶體區域,而引用不需要分配記憶體區域
    。)
     3、程式與執行緒的區別(①從概念上
    程式:一個程式對一個資料集的動態執行過程,是分配資源的基本單位。
    執行緒:一個程式內的基本排程單位。
    執行緒的劃分尺度小於程式,一個程式包含一個或者更多的執行緒。
    ②從執行過程中來看
    程式:擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而提高了應用程式的執行效率。
    執行緒:每一個獨立的執行緒,都有一個程式執行的入口、順序執行序列、和程式的出口。但是執行緒不能夠獨立的執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。
    ③從邏輯角度來看:(重要區別)
    多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但是,作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程式的排程和管理及資源分配
    。)
     4、函式呼叫入棧出棧的過程
     4、c++物件模型與虛表
     5、海量資料處理,以及如何解決Hash衝突等問題
     6、系統設計,概率演算法

  35.  今天騰訊面試:
    一個大小為N的陣列,裡面是N個整數,怎樣去除重複,
    要求時間複雜度為O(n),空間複雜度為O(1)(此題答案請見@作者hawksoft:http://blog.csdn.net/hawksoft/article/details/6867493)。

  36. 一個長度為10000的字串,寫一個演算法,找出最長的重複子串,如abczzacbca,結果是bc(思路:字尾樹/陣列的典型應用,@well:就是求字尾陣列的height[]的最大值  
    )。

  37. 今晚10.11大華筆試題:建立一個data structure表示沒有括號的表示式,而且找出所有等價(equivalent)的表示式 
    比如:
    3×5 == 5×3 
    2+3 == 3+2
  38. 今晚10.11百度二面:判斷一個數的所有因數的個數是偶數還是奇數(只需要你判斷因數的個數是偶數個還是奇數個,那麼可以這麼做@濱湖&&土豆:那隻在計算質因數的過程中統計一下當前質因數出現的次數,如果出現奇數次則結果為偶,然後可以立即返回;如果每個質因數的次數都是偶數,那麼結果為奇。如果該數是平方數 結果就為奇  否則就為偶了)。
  39. 比如A認識B,B認識C,但是A不認識C, 那麼稱C是A的二度好友。找出某個人的所有十度好友.  資料量為10萬(BFS,同時記錄已遍歷過的頂點,遍歷時遇到的已遍歷過的頂點不插入佇列。此是今晚10.11人人筆試題目,但它在上個月便早已出現在本人部落格中,即此文第23題第2小題:九月騰訊,創新工場,淘寶等公司最新面試十三題)。
  40. map在什麼情況下會發生死鎖;stl中的map是怎麼實現的?(有要參加淘寶面試的朋友注意,淘寶喜歡問STL方面的問題
  41. 昨日筆試:有四個人,他們每次一起出去玩的時候,用同時剪刀包袱錘的方式決定誰請客。設計一種方法,使得他們只需出一次,就可以決定請客的人,並且每個人請客的機率相同,均為25%。
  42. Given two sets of n numbers a1, a2…, an and b1, b2…bn, find, in polynomial time, a permutation Π such that ∑i |ai - b Π(i)| is minimized?  Prove your algorithm works.
    有兩個陣列,在多項式時間裡找到使 兩陣列元素 的差 的絕對值 的和 最小 的一種置換。
    並證明演算法的有效性。注意,關鍵是證明。(此題個人去年整理過類似的一題,詳見微軟面試100題2010版第32題:http://blog.csdn.net/v_JULY_v/archive/2011/01/10/6126444.aspx
  43. 對已排好序的陣列A,一般來說可用二分查詢 可以很快找到。
    現有一特殊陣列A[],它是迴圈遞增的,如A[]={ 17 19 20 25 1 4 7 9},
    試在這樣的陣列中找一元素x,看看是否存在。
    請寫出你的演算法,必要時可寫虛擬碼,並分析其空間 時間複雜度。
  44. 網易:題意很簡單,寫一個程式,列印出以下的序列。
    (a),(b),(c),(d),(e)........(z)
    (a,b),(a,c),(a,d),(a,e)......(a,z),(b,c),(b,d).....(b,z),(c,d).....(y,z)
    (a,b,c),(a,b,d)....(a,b,z),(a,c,d)....(x,y,z)
    ....
    (a,b,c,d,.....x,y,z)(思路:全排列問題
  45. int global = 0;

    // thread 1
    for(int i = 0; i < 10; ++i)
     global -= 1;

    // thread 2
    for(int i = 0; i < 10; ++i)
     global += 1;

    之後global的可能的值是多少(多種可能)?

  46. 今天10.13新浪筆試:
     1、用隱喻說明class和object的區別,要求有新意。
     2、DDL,DML,DCL的含義,和距離
     3、TCP建立連線的三次握手
     4、設計人民幣面值,要求種類最好,表示1——1000的所有數,平均紙幣張數最少
     5、UML
  47. 一個陣列。裡面的資料兩兩相同,只有兩個資料不同,要求找出這兩個資料。要求時間複雜度0(N)空間複雜度O(1)。
  48. 兩個數相乘,小數點後位數沒有限制,請寫一個高精度演算法。
  49. 面試基礎題:
     1、靜態方法裡面為什麼不能宣告靜態變數?
     2、如果讓你設計一個類,什麼時候把變數宣告為靜態型別?
     3、抽象類和介面的具體區別是什麼?
  50. 谷歌昨晚10.13演算法筆試三題:
    1.一個環形公路,上面有N個站點,A1, ..., AN,其中Ai和Ai+1之間的距離為Di,AN和A1之間的距離為D0。
    高效的求第i和第j個站點之間的距離,空間複雜度不超過O(N)
    它給出了部分程式碼如下:
    #define N 25
    double D[N] 
    ....
    void Preprocess()
    {
         //Write your code1;
    }
    double Distance(int i, int j)
    {
          //Write your code2;
    }

    2. 一個字串,壓縮其中的連續空格為1個後,對其中的每個字串逆序列印出來。比如"abc   efg  hij"列印為"cba gfe jih"。

    3. 將一個較大的錢,不超過1000000(10^6)的人民幣,兌換成數量不限的100、50、10、5、2、1的組合,請問共有多少種組合呢?(其它選擇題考的是有關:作業系統、樹、概率題、最大生成樹有關的題,另外聽老夢說,谷歌不給人霸筆的機會。)。

  51. 谷歌線上筆試題:
    輸入兩個整數A和B,輸出所有A和B之間滿足指定條件的數的個數。指定條件:假設C=8675在A跟B之間,若(8+6+7+5)/ 4 > 7,則計一個,否則不計。
    要求時間複雜度:log(A)+log(B)。
  52. 十五道百度、騰訊面試基礎測試題@fengchaokobe:
     1、寫一個C的函式,輸入整數N,輸出整數M,M滿足:M是2的n次方,且是不大於N中最大的2的n次方。例如,輸入4,5,6,7,都是輸出4 。
     2、C++中虛擬函式的實現機制。
     3、寫出選擇排序的程式碼及快速排序的演算法。
     4、你認為什麼排序演算法最好?
     5、tcp/ip的那幾層協議,IP是否是可靠的?為什麼?
     6、程式和執行緒的區別和聯絡,什麼情況下用多執行緒,什麼時候用多程式?
     7、指標陣列和陣列指標的區別。
     8、查詢單連結串列的中間結點。
     9、最近在實驗室課題研究或工作中遇到的技術難點,怎麼解決的?
     10、sizeof和strlen的區別。
     11、malloc-free和new-delete的區別
     12、大資料量中找中位數。
     13、堆和棧的區別。
     14、描述函式呼叫的整個過程。
     15、在一個兩維平面上有三個不在一條直線上的點。請問能夠作出幾條與這些點距離相同的線?
  53. 搜狐的一道筆試題:
     char *s="mysohu";
     s[0]=0; //..
     printf("%s",s);
    輸出是什麼啊?
    搜狐的一道大題:
      陣列非常長,如何找到第一個只出現一次的數字,說明演算法複雜度。(與個人之前整理的微軟面試100題中,第17題:在一個字串中找到第一個只出現一次的字元。類似,讀者可參考。
  54. 百度筆試3. 假設有一臺迷你計算機,1KB的記憶體,1MHZ的cpu,已知該計算機執行的程式可出現確定性終止(非死迴圈),問如何求得這臺計算機上程式執行的最長時間,可以做出任何大膽的假設。
  55. 微軟10.15筆試:對於一個陣列{1,2,3}它的子陣列有{1,2},{1,3}{2,3},{1,2,3},元素之間可以不是連續的,對於陣列{5,9,1,7,2,6,3,8,10,4},升序子序列有多少個?或者換一種表達為:陣列int a[]={5,9,1,7,2,6,3,8,10,4}  。求其所有遞增子陣列(元素相對位置不變)的個數,   例如:{5,9},{5,7,8,10},{1,2,6,8}。
  56. 今日騰訊南京筆試題:  M*M的方格矩陣,其中有一部分為障礙,八個方向均可以走,現假設矩陣上有Q+1節點,從(X0,Y0)出發到其他Q個節點的最短路徑。
    其中,1<=M<=1000,1<=Q<=100。
  57. 另外一個筆試題:
    一個字串S1:全是由不同的字母組成的字串如:abcdefghijklmn
    另一個字串S2:類似於S1,但長度要比S1短。
    問題是,設計一種演算法,求S2中的字母是否均在S1中。(
    字串包含問題,詳見程式設計師程式設計藝術系列第二章http://blog.csdn.net/v_JULY_v/article/details/6347454)。
  58.  檢索一英語全文,順序輸出檢測的單詞和單詞出現次數。
  59. 今天10.15下午網易遊戲筆試題:給一個有序陣列array[n],和一個數字m,判斷m是否是這些陣列裡面的數的和。(類似於微軟面試100題2010年版第4題,即相當於給定一棵樹,然後給定一個數,要求把那些 相加的和等於這個數的 所有節點列印出來)。
  60. 一個淘寶的面試題
    檔案A:
    uid username
    檔案B:
    username password
    檔案A是按照uid有序排列的,要求有序輸出合併後的A,B檔案,格式為uid username password(A B 兩個檔案都很大,記憶體裝不下。)
  61. 百度可能會問問memcached(可下載此份文件看看http://tech.idv2.com/2008/08/17/memcached-pdf/原始碼下載地址http://www.oschina.net/p/memcached),apache之類的。
  62. 今上午10.16百度筆試:1.C++ STL裡面的vector的實現機制,
    (1)當呼叫push_back成員函式時,怎麼實現?(粗略的說@owen,記憶體足則直接 placement new構造物件,否則擴充記憶體,轉移物件,新物件placement new上去。具體的參見此文http://blog.csdn.net/v_july_v/article/details/6681522
    (2)當呼叫clear成員函式時,做什麼操作,如果要釋放記憶體該怎麼做。(呼叫解構函式,記憶體不釋放。 clear沒有釋放記憶體,只是將陣列中的元素置為空了,釋放記憶體需要delete。
    2. 函式foo找錯,該函式的作用是將一個字串中的a-z的字母的頻數找出來
    void foo(char a[100],int cnt[256])
    {
    memset(cnt ,0, sizeof(cnt));
    while (*a!='\0')
    {
    ++cnt[*a];
    ++a;
    }
    for ( char c='a';c<='z';++c)
    {
    printf("%c:%d\n",c,cnt[c]);
    }
    }
    int main()
    {
    char a[100]="百度abc";
    int cnt[256];
    foo(a,cnt);
    return 0;
    }
  63. 騰訊長沙筆試:旅行商問題。
  64. 今天完美10.16筆試題:2D平面上有一個三角形ABC,如何從這個三角形內部隨機取一個點,且使得在三角形內部任何點被選取的概率相同。
  65. 不用任何中間變數,實現strlen函式
    1. 筆試:聯合賦值問題:#include <stdio.h>
      union A{
      int i;
      char x[2];
      }a;
      int main()
      {
      a.x[0]=10;
      a.x[1]=1;
      printf("%d\n",a.i);
      return 0;
      }
      sizeof(a) = sizeof(int) = 4 byte
      4 * 8 = 32 bit
      a = > 00000000 00000000 00000000 00000000
      a.x[0]=10 => 00000000 00000000 00000000 00001010
      a.x[1]=1 => 00000000 00000000 00000001 00001010
      a.i = 1*256 + 1*8 + 1*2 = 256+10 = 266
    2. 昨天做了中興的面試題:
      struct A{
        int a;
        char b;
        char c;
      };
      問sizeof(A)是多大?
    3. 你好:
                      今天5月6日百度筆試,遇到一個題目,沒想到比較好的思路 在網上看了不太明朗,,希望你幫我解答下
         題目如下:
      百度研發筆試題。設子陣列A[0:k]和A[k+1:N-1]已排好序(0≤K≤N-1)。試設計一個合併這2個子陣列為排好序的陣列A[0:N-1]的演算法。要求演算法在最壞情況下所用的計算時間為O(N),只用到O(1)的輔助空間。
      若論這道題的來源,則是在高德納的計算機程式設計藝術第三卷第五章排序中,如下(第一張圖是原題,第二張圖是書上附的答案):
    4. 百度實習生筆試題:
      一個單詞如果交換其所含字母順序,得到的單詞稱為兄弟單詞,例如mary和army是兄弟單詞,即所含字母是一樣的,只是字母順序不同,使用者輸入一個單詞,要求在一個字典中找出該單詞的所有兄弟單詞,並輸出。給出相應的資料結構及演算法。要求時間和空間複雜度儘可能低
      目前思想:
      struct {
         char  data;
         int  n
      };
      根據數學定理:任何一個大於1的自然數N,都可以唯一分解成有限個質數的乘積 N=(P_1^a1)*(P_2^a2)......(P_n^an) , 這裡P_1<P_2<...<P_n是質數,且唯一。
      例如
      a=2 b=3 c=5 d=7 e=11...
      f(abcd)=2*3*5*7=210 
      然後字典裡找乘積210的位數相同的一定是這5個字母組合的單詞就是兄弟單詞 
    5. 更新至2012.05.06下午.....

        更多面試題,參見橫空出世,席捲Csdn--評微軟等資料結構+演算法面試100題 (在此文中,集結了本部落格已經整理的236道面試題)。

    後記   

        此些面試題看多了,自然會發現題目型別可能會千變萬化,但解決問題的思路卻只有那麼幾種。再者,寫程式碼的時候,很多的細節需要務必注意,如返回值,函式引數的檢查,特殊情況的處理等等,這是一個程式碼規範性的問題。


相關文章