1)各大網路公司都喜歡問,比如說給你兩個存放有10G個名字的檔案,每個名字需要64個位元組,你的電腦只有4G記憶體,問怎樣找到兩個檔案中相同的名字(假設單個檔案中沒有重複)。
這個問題其實代表了很常見的一類問題,即大資料的處理問題,這類問題通常的做法是使用hash函數將大檔案中的資料放到記憶體可以放下的小檔案中,然後調用普通方法(如記憶體中的統計,排序)進行處理。上面的問題每個檔案有640G的大小,按照記憶體4G處理,可以把兩個檔案分成320個小檔案,然後對每個名字進行hash處理,分到320小檔案中,然後將小檔案讀到記憶體中進行名字統計,如果摸個名字出現了兩次則是兩個檔案中重複的。
(2)給你10個盛放藥品的瓶子,其中9個是放的是A,另一個放的B,A和B放到一起會在60分鐘後變色,問給你70分鐘,問至少需要幾隻試管可以測出那隻瓶子中存放的是B。
問題很進階,解法很巧妙,首先將十隻瓶子進行編號(0000,0001,0010,0011,0100,0101,0110,0111,1000,1001),然後取四隻試管,分別代表四位,將相應位為1的藥瓶中的藥品取少量放入試管中,等待60分鐘後,變色的位代表1,不變色的代表0,這樣就找到盛有B藥品的藥瓶編號,所以四個試管就可以找出盛有B藥品的藥瓶。
(3)有1000盞等,編號從1到1000,有1000個人,編號從1到1000,所有的燈開始都是滅的,每個人必須對是他自身編號倍數(如3可以對3,6,9...號燈進行操作)的燈進行一次操作,如果燈是亮的就按滅他,否則按亮他。問所有的人都操作成後,所有的燈是什麼狀態。
可以通過特例來進行分析,如16和20,9可以被1,16,2,8,4操作,然後他是亮的,20可以被1,20,2,10,4,5操作,最後他是滅的,所以對於一個數N,只要有一個數x可以整除他,那必定有一個y存在,y=N/x,所以他們這樣的數對N的操作可以抵消,只有當x=y時不能被抵消,即N開方是整數時,不可以被抵消,這樣的燈是亮的,其餘的燈是滅的。
(4)給你一個函數f(),他以機率p產生0,以機率1-p產生1,問如何產生一個函數g(),以相同的機率產生0和1。
問題很巧妙,要求你用f()產生兩種機率相等的狀態就行,其他變種也都差不多,也是找到n中機率相等的狀態就可以了。如使用f()兩次,可以產生(0,0),(0,1),(1,0),(1,1),顯然產生(0,1),(1,0)狀態就是相等的,產生其他狀態是可以在重複調用兩次f()直到產生需要的兩種狀態位置,這樣就構造除了g()函數。
(5)給你一個大小為N的數組int[] A,求取N個乘積,第i個乘積為除去A[i]的數組中所有數的乘積,不能用除法,問如何在O(n)的時間複雜度內,求的所有的N個乘積。
這個問題是明顯的空間換時間的問題,可以對數組遍曆兩遍求取所有數組的從前到後,從後到前的部分積,如現在要求第i個乘積,只需取出從1到i-1的部分積和從N到i+1的部分積相乘就可以了,總共進行了3N次操作,時間複雜度為O(N)。
(6)給你一個天平,稱三次,問最多可以從多少個小球中找到品質較輕的一個。
答案是27個,因為天平每次可以將小球分成三組,並可以判斷品質較輕的那個小球在那一組中,三次就可以找出較輕的那個。