騰訊,創新工場,淘寶面試題

idaretobe發表於2015-01-13

 好久沒有好好享受思考了。ok,任何人有任何意見或問題,歡迎不吝指導:

  1. 五隻猴子分桃。半夜,第一隻猴子先起來,它把桃分成了相等的五堆,多出一隻。於是,它吃掉了一個,拿走了一堆; 第二隻猴子起來一看,只有四堆桃。於是把四堆合在一起,分成相等的五堆,又多出一個。於是,它也吃掉了一個,拿走了一堆;.....其他幾隻猴子也都是 這樣分的。問:這堆桃至少有多少個?(朋友說,這是小學奧數題)。
     參考答案:先給這堆桃子加上4個,設此時共有X個桃子,最後剩下a個桃子.這樣: 
      第一隻猴子分完後還剩:(1-1/5)X=(4/5)X; 
      第二隻猴子分完後還剩:(1-1/5)2X;
      第三隻猴子分完後還剩:(1-1/5)3X;
      第四隻猴子分完後還剩:(1-1/5)4X;
      第五隻猴子分完後還剩:(1-1/5)5X=(1024/3125)X;
      得:a=(1024/3125)X;
      要使a為整數,X最小取3125.
      減去加上的4個,所以,這堆桃子最少有3121個。
  2. 已知有個rand7()的函式,返回1到7隨機自然數,讓利用這個rand7()構造rand10() 隨機1~10
    (參考答案:這題主要考的是對概率的理解。程式關鍵是要算出rand10,1到10,十個數字出現的考慮都為10%.根據排列組合,連續算兩次rand7出現的組合數是7*7=49,這49種組合每一種出現考慮是相同的。怎麼從49平均概率的轉換為1到10呢?方法是:
    1.rand7執行兩次,出來的數為a1=rand7()-1,a2=rand7()-1.
    2.如果a1*7+a2<40,b=(a1*7+a2)/4+1;如果a1*7+a2>=40,重複第一步
    。參考程式碼如下所示:
    1. int rand7()  
    2. {  
    3.   return rand()%7+1;  
    4. }  
    5.   
    6. int rand10()  
    7. {  
    8.   int a71,a72,a10;  
    9.   do   
    10.   {  
    11.     a71= rand7()-1;  
    12.     a72 = rand7()-1;  
    13.     a10 = a71 *7 + a72;  
    14.   } while (a10>= 40);  
    15.   return (a71*7+a72)/4+1;  
    16. }  
  3. 如果兩個字串的字元一樣,但是順序不一樣,被認為是兄弟字串,問如何在迅速匹配兄弟字串(如,bad和adb就是兄弟字串)。思路:判斷各自素數乘積是否相等。更多方法請參見:http://blog.csdn.net/v_JULY_v/article/details/6347454
  4. 要求設計一個DNS的Cache結構,要求能夠滿足每秒5000以上的查詢,滿足IP資料的快速插入,查詢的速度要快。
  5. 一個未排序整數陣列,有正負數,重新排列使負數排在正數前面,並且要求不改變原來的正負數之間相對順序 比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求時間複雜度O(N),空間O(1) 。此題一直沒看到令我滿意的答案,一般達不到題目所要求的:時間複雜度O(N),空間O(1),且保證原來正負數之間的相對位置不變)。

    updated:設定一個起始點j, 一個翻轉點k,一個終止點L
    從右側起
    起始點在第一個出現的負數, 翻轉點在起始點後第一個出現的正數,終止點在翻轉點後出現的第一個負數(或結束)
    如果無翻轉點, 則不操作
    如果有翻轉點, 則待終止點出現後, 做翻轉, 即ab => ba 這樣的操作
    翻轉後, 負數串一定在左側, 然後從負數串的右側開始記錄起始點, 繼續往下找下一個翻轉點
     
    例子中的就是

    1, 7, -5,9,-12, 15  
    第一次翻轉: 1,7, -5,-12,9, 15   => 1, -12,-5,7, 9, 15
    第二次翻轉: -5, -12, 1, 7, 9, 15

        N維翻轉空間佔用為O(1)複雜度是2N;在有一個負數的情況下, 複雜度最大是2N, ;在有i個負數的情況下, 複雜度最大是2N+2i, 但是不會超過2N+N實際的複雜度在O(3N)以內
       但從最終時間複雜度分析,此方法是否真能達到O(N)的時間複雜度,還待後續考證。感謝John_Lv,MikovChain。2012.02.25

    1, 7, -5, -6, 9, -12, 15(後續:此種情況未能處理)
    1 7 -5 -6 -12 9 15
    1 -12 -5 -6 7 9 15
    -6 -12 -5 1 7 9 15

    更多請參考此文,程式設計師程式設計藝術第二十七章:重新排列陣列(不改變相對順序&時間O(N)&空間O(1),半年未被KO)http://blog.csdn.net/v_july_v/article/details/7329314

  6. 淘寶面試題:有一個一億節點的樹,現在已知兩個點,找這兩個點的共同的祖先。
  7. 海量資料分佈在100臺電腦中,想個辦法高效統計出這批資料的TOP10。(此題請參考本部落格內其它文章)。
  8. 某伺服器流量統計器,每天有1000億的訪問記錄資料,包括時間、url、ip。設計系統實現記錄資料的

    儲存、管理、查詢。要求能實現一下功能:
    (1)計算在某一時間段(精確到分)時間內的,某url的所有訪問量。
    (2)計算在某一時間段(精確到分)時間內的,某ip的所有訪問量。

  9.  

    假設某個網站每天有超過10億次的頁面訪問量,出於安全考慮,網站會記錄訪問客戶端訪問的ip地址和對應的時間,如果現在已經記錄了1000億條資料,想統計一個指定時間段內的區域ip地址訪問量,那麼這些資料應該按照何種方式來組織,才能儘快滿足上面的統計需求呢,
    設計完方案後,並指出該方案的優缺點,比如在什麼情況下,可能會非常慢?(參考答案:用B+樹來組織,非葉子節點儲存(某個時間點,頁面訪問量),葉子節點是訪問的IP地址。這個方案的優點是查詢某個時間段內的IP訪問量很快,但是要統計某個IP的訪問次數或是上次訪問時間就不得不遍歷整個樹的葉子節點。或者可以建立二級索引,分別是時間和地點來建立索引。

  10.  

    騰訊1.伺服器記憶體1G,有一個2G的檔案,裡面每行存著一個QQ號(5-10位數),怎麼最快找出出現過最多次的QQ號。(此題與稍後下文的第14題重複,思路參考請見下文第14題)。
    騰訊2.如何求根號2的值,並且按照我的需要列出指定小數位,比如根號2是1.141 我要列出1位小數就是1.1 2位就是1.14, 1000位就是1.141...... 等。。

  11.  

    給定一個字串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求將其中交集不為空的集合合併,要求合併完成後的集合之間無交集,例如上例應輸出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。
  12.  

    創新工場面試題:abcde五人打漁,打完睡覺,a先醒來,扔掉1條魚,把剩下的分成5分,拿一份走了;b再醒來,也扔掉1條,把剩下的分成5份,拿一份走了;然後cde都按上面的方法取魚。問他們一共打了多少條魚,寫程式和演算法實現。提示:共打了多少條魚的結果有很多。但求最少打的魚的結果是3121條魚(應該找這5個人問問,用什麼工具打了這麼多條魚)。(http://blog.csdn.net/nokiaguy/article/details/6800209)。
  13. 我們有很多瓶無色的液體,其中有一瓶是毒藥,其它都是蒸餾水,實驗的小白鼠喝了以後會在5分鐘後死亡,而喝到蒸餾水的小白鼠則一切正常。現在有5只小白鼠,請問一下,我們用這五隻小白鼠,5分鐘的時間,能夠檢測多少瓶液體的成分?
    淘寶2012筆試(研發類):http://topic.csdn.net/u/20110922/10/e4f3641a-1f31-4d35-80da-7268605d2d51.html一參考答案)。

    ok,這13道題加上此前本部落格陸陸續續整理的微軟面試187題:重啟開源,分享無限--誠邀你加入微軟面試187題的解題中,至此,本部落格內已經整理了整整200道面試題。

後續整理

    以下是後續整理的最新面試題,不斷更新中(2011.09.26).....

14、騰訊最新面試題:伺服器記憶體1G,有一個2G的檔案,裡面每行存著一個QQ號(5-10位數),怎麼最快找出出現過最多次的QQ號。

以下是個人所建第Algorithms_12群內朋友的聊天記錄:

    首先你要注意到,資料存在伺服器,儲存不了(記憶體存不了),要想辦法統計每一個qq出現的次數。
比如,因為記憶體是1g,首先 你用hash 的方法,把qq分配到10個(這個數字可以變動,比較)檔案(在硬碟中)。
    相同的qq肯定在同一個檔案中,然後對每一個檔案,只要保證每一個檔案少於1g的記憶體,統計每個qq的次數,可以使用hash_map(qq, qq_count)實現。然後,記錄每個檔案的最大訪問次數的qq,最後,從10個檔案中找出一個最大,即為所有的最大。更多讀者可以參見此文:海量資料處理面試題集錦與Bit-map詳解 

    那若面試官問有沒有更高效率的解法之類的?這時,你可以優化一下,但是這個速度很快,hash函式,速度很快,他肯定會問,你如何設計,用bitmap也行。

15百度今天的筆試題:在一維座標軸上有n個區間段,求重合區間最長的兩個區間段。

16華為社招現場面試1:請使用程式碼計算1234567891011121314151617181920*2019181716151413121110987654321 。

華為面試2:1分2分5分的硬幣,組成1角,共有多少種組合。

17、百度筆試題:

一、系統有很多工,任務之間有依賴,比如B依賴於A,則A執行完後B才能執行
  (1)不考慮系統並行性,設計一個函式(Task *Ptask,int Task_num)不考慮並行度,最快的方法完成所有任務。
  (2)考慮並行度,怎麼設計
  typedef struct{
      int ID;
     int * child;
      int child_num;
  }Task;
  提供的函式:
    bool doTask(int taskID);無阻塞的執行一個任務;
    int waitTask(int timeout);返回執行完成的任務id,如果沒有則返回-1;
    bool killTask(int taskID);殺死程式

二、必答題(各種const)

1、解釋下面ptr含義和不同
double* ptr = &value;
    //ptr是一個指向double型別的指標,ptr的值可以改變,ptr所指向的value的值也可以改變 
const double* ptr = &value
    //ptr是一個指向const double型別的指標,ptr的值可以改變,ptr所指向的value的值不可以改變
double* const ptr=&value
    //ptr是一個指向double型別的指標,ptr的值不可以改變,ptr所指向的value的值可以改變
const double* const ptr=&value
    //ptr是一個指向const double型別的指標,ptr的值不可以改變,ptr所指向的value的值也不可以改變

2、去掉const屬性,例:  const double value = 0.0f;  double* ptr = NULL;怎麼才能讓ptr指向value?
    強制型別轉換,去掉const屬性,如ptr = <const_cast double *>(&value);

http://topic.csdn.net/u/20110925/16/e6248e53-1145-4815-8d24-9c9019d24bd8.html?seed=1665205011&r=75709169#r_75709169

18、如果用一個迴圈陣列q[0..m-1]表示佇列時,該佇列只有一個佇列頭指標front,不設佇列尾指標rear,求這個佇列中從佇列投到佇列尾的元素個數(包含佇列頭、佇列尾)(華賽面試題、騰訊筆試題)。

19、昨晚淘寶筆試題:

1. 設計相應的資料結構和演算法,儘量高效的統計一片英文文章(總單詞數目)裡出現的所有英文單詞,按照在文章中首次出現的順序列印輸出該單詞和它的出現次數。

2、有一棵樹(樹上結點為字串或者整數),請寫程式碼將樹的結構和資料寫到一個檔案中,並能通過讀取該檔案恢復樹結構 。

20、13個球一個天平,現知道只有一個和其它的重量不同,問怎樣稱才能用三次就找到那個球?(http://zhidao.baidu.com/question/66024735.html
)。

21、搜狗筆試題:一個長度為n的陣列a[0],a[1],...,a[n-1]。現在更新陣列的名個元素,即a[0]變為a[1]到a[n-1]的積,a[1]變為a[0]和a[2]到a[n-1]的積,...,a[n-1]為a[0]到a[n-2]的積(就是除掉當前元素,其他所有元素的積)。程式要求:具有線性複雜度,且不能使用除法運算子。

    思路:left[i]標示著a[i]之前的乘積,right[i]標示著a[i]之後的乘積,但不申請空間,那麼a[i]=left[i]*right[i] 。不過,left的計算從左往右掃的時候得出,right是從右往左掃得出。因為就是當中某個元素a[i]的左邊所有元素與右邊所有元素的乘積,就這麼簡單。所以計算a[i]=left[i]*right[i]時,直接出結果。

22、後2012年4月6日的騰訊暑期實習生招聘筆試中,出了一道與上述21題類似的題,原題大致如下:

    兩個陣列a[N],b[N],其中A[N]的各個元素值已知,現給b[i]賦值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i];
要求:
1.不準用除法運算
2.除了迴圈計數值,a[N],b[N]外,不準再用其他任何變數(包括區域性變數,全域性變數等)
3.滿足時間複雜度O(n),空間複雜度O(1)。

    說白了,你要我求b=a[0]*a*...a[i-1]*a*a[i+1]..*a[N-1]/a ,就是求:a[0]*a[1]*...a[i-1]*a[i+1]..*a[N-1]。只是我把a[i]左邊部分標示為left[i],b[i]右邊部分標示為right[i],而實際上完全不申請left[i],與right[i]變數,之所以那樣標示,無非就是為了說明:除掉當前元素a[i],其他所有元素(a[i]左邊部分,和a[i]右邊部分)的積。讀者你明白了麼?

    下面是此TX筆試題的兩段參考程式碼,如下:

  1. //ncicc  
  2. b[0] = 1;  
  3. for (int i = 1; i < N; i++)  
  4. {  
  5.   b[0] *= a[i-1];  
  6.   b[i] = b[0];  
  7. }  
  8. b[0] = 1;  
  9. for (i = N-2; i > 0; i--)  
  10. {  
  11.   b[0] *= a[i+1];  
  12.   b[i] *= b[0];  
  13. }  
  14. b[0] *= a[1];  
   from wasd6081058上面第二段程式碼最後一行的意義是:我們看第二個迴圈,從N-2到 1;再看for迴圈中b[0]的賦值,從N-1到2,而根據題目要求b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i],b[0]應等於a[1]*a[2]* ....a[N-1],所以這裡手動新增a[1]。
  此外,也有朋友在微博上:http://weibo.com/1761944724/ydwuMt9bH 給出了另外一種解法,如下圖所示:
      

23、騰訊高水平復試題:

1.有不同的手機終端,如iphone,安卓,Symbian,不同的終端處理不一樣,設計一種伺服器和演算法實現對不同的終端的處理。
2.設計一種記憶體管理演算法。 
3.A向B發郵件,B收到後讀取併傳送收到,但是中間可能丟失了該郵件,怎麼設計一種最節省的方法,來處理丟失問題。 
4.設計一種演算法求出演算法複雜度 。

24、人人筆試1:一個人上臺階可以一次上1個,2個,或者3個,問這個人上n層的臺階,總共有幾種走法?
       人人筆試2:在人人好友裡,A和B是好友,B和C是好友,如果A 和C不是好友,那麼C是A的二度好友,在一個有10萬人的資料庫裡,如何在時間0(n)裡,找到某個人的十度好友。
25、淘寶演算法面試題:兩個使用者之間可能互相認識,也可能是單向的認識,用什麼資料結構來表示?如果一個使用者不認識別人,而且別人也不認識他,那麼他就是無效節點,如何找出這些無效節點?自定義資料介面並實現之,要求儘可能節約記憶體和空間複雜度。
26、淘寶筆試題:對於一顆完全二叉樹,要求給所有節點加上一個pNext指標,指向同一層的相鄰節點;如果當前節點已經是該層的最後一個節點,則將pNext指標指向NULL;給出程式實現,並分析時間複雜度和空間複雜度。
27、騰訊面試題:給你5個球,每個球被抽到的可能性為30、50、20、40、10,設計一個隨機演算法,該演算法的輸出結果為本次執行的結果。輸出A,B,C,D,E即可。
28、搜狐筆試題:給定一個實數陣列,按序排列(從小到大),從陣列從找出若干個數,使得這若干個數的和與M最為接近,描述一個演算法,並給出演算法的複雜度。
29阿里巴巴研究院(2009):
1. 有無序的實數列V[N],要求求裡面大小相鄰的實數的差的最大值,關鍵是要求線性空間和線性時間
2. 25匹賽馬,5個跑道,也就是說每次有5匹馬可以同時比賽。問最少比賽多少次可以知道跑得最快的5匹馬
3. 有一個函式int getNum(),每執行一次可以從一個陣列V[N]裡面取出一個數,N未知,當數取完的時候,函式返回NULL。現在要求寫一個函式int get(),這個函式執行一次可以從V[N]裡隨機取出一個數,而這個數必須是符合1/N平均分佈的,也就是說V[N]裡面任意一個數都有1/N的機會被取出,要求空間複雜度為O(1)
30、微軟面試題:Given a head pointer pointing to a linked list ,please write a function that sort the list
in increasing order. You are not allowed to use temporary array or memory copy
struct
{
  int data;
  struct S_Node *next;
}Node;
Node * sort_link_list_increasing_order (Node *pheader):

淘寶面試:

http://wenku.it168.com/tag/29763_0_1.shtml

http://www.mianwww.com/html/category/company-list/taobao


相關文章