????????九月騰訊,創新工場,淘寶等公司最新面試三十題
引言???
??? 曾記否,去年的10月份也同此刻一樣,是找工作的高峰期,本博客便是最初由整理微軟等公司面試題而發展而來的。如今,又即將邁入求職高峰期--10月份,而本人也正在找下一份工作中,所以,也不免關注了網上和我個人建的算法群Algorithms1-12群內朋友發布和討論的最新面試題。特此整理,以饗諸位。至于答案,望諸位共同討論與思考。
最新面試十三題
??? 好久沒有好好享受思考了。ok,任何人有任何意見或問題,歡迎不吝指導:
- 五只猴子分桃。半夜,第一只猴子先起來,它把桃分成了相等的五堆,多出一只。于是,它吃掉了一個,拿走了一堆; 第二只猴子起來一看,只有四堆桃。于是把四堆合在一起,分成相等的五堆,又多出一個。于是,它也吃掉了一個,拿走了一堆;.....其他幾只猴子也都是 這樣分的。問:這堆桃至少有多少個?(朋友說,這是小學奧數題)。
? 參考答案:先給這堆桃子加上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個。 - 已知有個rand7()的函數,返回1到7隨機自然數,讓利用這個rand7()構造rand10() 隨機1~10。
(參考答案:這題主要考的是對概率的理解。程序關鍵是要算出rand10,1到10,十個數字出現的考慮都為10%.根據排列組合,連續算兩次rand7出現的組合數是7*7=49,這49種組合每一種出現考慮是相同的。怎么從49平均概率的轉換為1到10呢?方法是:
1.rand7執行兩次,出來的數為a1.a2.
2.如果a1*7+a2<40,b=(a1*7+a2)/10+1,如果a1*7*a2>=40,重復第一步)。參考代碼如下所示:- int?rand7()??
- {??
- ??return?rand()%7+1;??
- }??
- ??
- int?rand10()??
- {??
- ??int?a71,a72,a10;??
- ??do???
- ??{??
- ????a71=?rand7()-1;??
- ????a72?=?rand7()-1;??
- ????a10?=?a71?*7?+?a72;??
- ??}?while?(a10>=?40);??
- ??return?(a71*7+a72)/4+1;??
- }??
- 如果兩個字符串的字符一樣,但是順序不一樣,被認為是兄弟字符串,問如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)。
- 要求設計一個DNS的Cache結構,要求能夠滿足每秒5000以上的查詢,滿足IP數據的快速插入,查詢的速度要快。
- 一個未排序整數數組,有正負數,重新排列使負數排在正數前面,并且要求不改變原來的正負數之間相對順序 比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求時間復雜度O(N),空間O(1) 。(此題一直沒看到令我滿意的答案,一般達不到題目所要求的:時間復雜度O(N),空間O(1),且保證原來正負數之間的相對位置不變)。
- 淘寶面試題:有一個一億節點的樹,現在已知兩個點,找這兩個點的共同的祖先。
- 海量數據分布在100臺電腦中,想個辦法高效統計出這批數據的TOP10。(此題請參考本博客內其它文章)。
-
某服務器流量統計器,每天有1000億的訪問記錄數據,包括時間、url、ip。設計系統實現記錄數據的
保存、管理、查詢。要求能實現一下功能:
(1)計算在某一時間段(精確到分)時間內的,某url的所有訪問量。
(2)計算在某一時間段(精確到分)時間內的,某ip的所有訪問量。 -
?
假設某個網站每天有超過10億次的頁面訪問量,出于安全考慮,網站會記錄訪問客戶端訪問的ip地址和對應的時間,如果現在已經記錄了1000億條數據,想統計一個指定時間段內的區域ip地址訪問量,那么這些數據應該按照何種方式來組織,才能盡快滿足上面的統計需求呢,
設計完方案后,并指出該方案的優缺點,比如在什么情況下,可能會非常慢?(參考答案:用B+樹來組織,非葉子節點存儲(某個時間點,頁面訪問量),葉子節點是訪問的IP地址。這個方案的優點是查詢某個時間段內的IP訪問量很快,但是要統計某個IP的訪問次數或是上次訪問時間就不得不遍歷整個樹的葉子節點。或者可以建立二級索引,分別是時間和地點來建立索引。) -
?
騰訊1.服務器內存1G,有一個2G的文件,里面每行存著一個QQ號(5-10位數),怎么最快找出出現過最多次的QQ號。(此題與稍后下文的第14題重復,思路參考請見下文第14題)。
騰訊2.如何求根號2的值,并且按照我的需要列出指定小數位,比如根號2是1.141 我要列出1位小數就是1.1 2位就是1.14, 1000位就是1.141...... 等。。 -
?
給定一個字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求將其中交集不為空的集合合并,要求合并完成后的集合之間無交集,例如上例應輸出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。 -
?
創新工場面試題:abcde五人打漁,打完睡覺,a先醒來,扔掉1條魚,把剩下的分成5分,拿一份走了;b再醒來,也扔掉1條,把剩下的分成5份,拿一份走了;然后cde都按上面的方法取魚。問他們一共打了多少條魚,寫程序和算法實現。提示:共打了多少條魚的結果有很多。但求最少打的魚的結果是3121條魚(應該找這5個人問問,用什么工具打了這么多條魚)。(http://blog.csdn.net/nokiaguy/article/details/6800209)。 - 我們有很多瓶無色的液體,其中有一瓶是毒藥,其它都是蒸餾水,實驗的小白鼠喝了以后會在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]=left[i]*right[i]時,直接出結果。
22、騰訊高水平復試題:
1.有不同的手機終端,如iphone,安卓,Symbian,不同的終端處理不一樣,設計一種服務器和算法實現對不同的終端的處理。
2.設計一種內存管理算法。?
3.A向B發郵件,B收到后讀取并發送收到,但是中間可能丟失了該郵件,怎么設計一種最節省的方法,來處理丟失問題。?
4.設計一種算法求出算法復雜度 。
23、人人筆試1:一個人上臺階可以一次上1個,2個,或者3個,問這個人上n層的臺階,總共有幾種走法?? ? ? ?人人筆試2:在人人好友里,A和B是好友,B和C是好友,如果A 和C不是好友,那么C是A的二度好友,在一個有10萬人的數據庫里,如何在時間0(n)里,找到某個人的十度好友。24、淘寶算法面試題:兩個用戶之間可能互相認識,也可能是單向的認識,用什么數據結構來表示?如果一個用戶不認識別人,而且別人也不認識他,那么他就是無效節點,如何找出這些無效節點?自定義數據接口并實現之,要求盡可能節約內存和空間復雜度。25、淘寶筆試題:對于一顆完全二叉樹,要求給所有節點加上一個pNext指針,指向同一層的相鄰節點;如果當前節點已經是該層的最后一個節點,則將pNext指針指向NULL;給出程序實現,并分析時間復雜度和空間復雜度。26、騰訊面試題:給你5個球,每個球被抽到的可能性為30、50、20、40、10,設計一個隨機算法,該算法的輸出結果為本次執行的結果。輸出A,B,C,D,E即可。27、搜狐筆試題:給定一個實數數組,按序排列(從小到大),從數組從找出若干個數,使得這若干個數的和與M最為接近,描述一個算法,并給出算法的復雜度。28、蘋果面試題:write a function that will trigger a prefetch address abort exception。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)
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):
更新至2011.09.30....
? ? 如果各位對上面的題目有好的思路,或者還有好的面試題分享,歡迎添加到本文評論下,或者發至我的郵箱:zhoulei0709@yahoo.cn。謝謝大家。July、2011.09.30。