轉載請標明出處,原文地址:http://blog.csdn.net/hackbuteer1/article/details/6726419
偶然間在網上看到幾個原來沒見過的面試智力題,有幾個題目在國內流傳至關廣,什麼n我的怎麼分餅最公平,屋裏的三個燈泡分別由哪一個開關控制,三架飛機環遊世界,用火柴和兩根繩子測量45分鐘之類的題目,火星得已經能夠考古了,這裏就再也不說了。ios
一、考慮一個雙人遊戲。遊戲在一個圓桌上進行。每一個遊戲者都有足夠多的硬幣。他們須要在桌子上輪流放置硬幣,每次必需且只能放置一枚硬幣,要求硬幣徹底置於桌面內(不能有一部分懸在桌子外面),而且不能與原來放過的硬幣重疊。誰沒有地方放置新的硬幣,誰就輸了。遊戲的先行者仍是後行者有必勝策略?這種策略是什麼?
答案:先行者在桌子中心放置一枚硬幣,之後的硬幣老是放在與後行者剛纔放的地方相對稱的位置。這樣,只要後行者能放,先行者必定也有地方放。先行者必勝。面試
二、 用線性時間和常數附加空間將一篇文章的單詞(不是字符)倒序。
答案:先將整篇文章的全部字符逆序(從兩頭起不斷交換位置相對稱的字符);而後用一樣的辦法將每一個單詞內部的字符逆序。這樣,整篇文章的單詞順序顛倒了,但單詞自己又被轉回來了。數組
三、 用線性時間和常數附加空間將一個長度爲n的字符串向左循環移動m位(例如,"abcdefg"移動3位就變成了"defgabc")。
答案:把字符串切成長爲m和n-m的兩半。將這兩個部分分別逆序,再對整個字符串逆序。安全
四、一個矩形蛋糕,蛋糕內部有一塊矩形的空洞。只用一刀,如何將蛋糕切成大小相等的兩塊?
答案:注意到平分矩形面積的線都通過矩形的中心。過大矩形和空心矩形各自的中心畫一條線,這條線顯然把兩個矩形都分紅了一半,它們的差固然也是相等的。函數
五、 一塊矩形的巧克力,初始時由N x M個小塊組成。每一次你只能把一塊巧克力掰成兩個小矩形。最少須要幾回才能把它們掰成N x M塊1x1的小巧克力?
答案:N x M - 1次顯然足夠了。這個數目也是必需的,由於每掰一次後當前巧克力的塊數只能增長一,把巧克力分紅N x M塊固然須要至少掰N x M - 1次。spa
六、如何快速找出一個32位整數的二進制表達裏有多少個"1"?用關於"1"的個數的線性時間?
答案1(關於數字位數線性):for(n=0; b; b >>= 1) if (b & 1) n++;
答案2(關於"1"的個數線性):for(n=0; b; n++) b &= b-1;.net
七、 一個大小爲N的數組,全部數都是不超過N-1的正整數。用O(N)的時間找出重複的那個數(假設只有一個)。一個大小爲N的數組,全部數都是不超過N+1的正整數。用O(N)的時間找出沒有出現過的那個數(假設只有一個)。
答案:計算數組中的全部數的和,再計算出從1到N-1的全部數的和,二者之差即爲重複的那個數。計算數組中的全部數的和,再計算出從1到N+1的全部數的和,二者之差即爲缺乏的那個數。code
八、 給出一行C語言表達式,判斷給定的整數是不是一個2的冪。
答案:(b & (b-1)) == 0orm
九、地球上有多少個點,使得從該點出發向南走一英里,向東走一英里,再向北走一英里以後剛好回到了起點?
答案:「北極點」是一個傳統的答案,其實這個問題還有其它的答案。事實上,知足要求的點有無窮多個。全部距離南極點1 + 1/(2π)英里的地方都是知足要求的,向南走一英里後到達距離南極點1/(2π)的地方,向東走一英里後正好繞行緯度圈一週,再向北走原路返回到起點。事實上,這仍然不是知足要求的所有點。距離南極點1 + 1/(2kπ)的地方都是能夠的,其中k能夠是任意一個正整數。blog
十、A、B兩人分別在兩座島上。B生病了,A有B所須要的藥。C有一艘小船和一個能夠上鎖的箱子。C願意在A和B之間運東西,但東西只能放在箱子裏。只要箱子沒被上鎖,C都會偷走箱子裏的東西,無論箱子裏有什麼。若是A和B各自有一把鎖和只能開本身那把鎖的鑰匙,A應該如何把東西安全遞交給B?
答案:A把藥放進箱子,用本身的鎖把箱子鎖上。B拿到箱子後,再在箱子上加一把本身的鎖。箱子運回A後,A取下本身的鎖。箱子再運到B手中時,B取下本身的鎖,得到藥物。
十一、 一對夫婦邀請N-1對夫婦參加聚會(所以聚會上總共有2N人)。每一個人都和全部本身不認識的人握了一次手。而後,男主人問其他全部人(共2N-1我的)各自都握了幾回手,獲得的答案所有都不同。假設每一個人都認識本身的配偶,那麼女主人握了幾回手?
答案:握手次數只多是從0到2N-2這2N-1個數。除去男主人外,一共有2N-1我的,所以每一個數剛好出現了一次。其中有一我的(0)沒有握手,有一我的(2N-2)和全部其它的夫婦都握了手。這兩我的確定是一對夫妻,不然後者將和前者握手(從而前者的握手次數再也不是0)。除去這對夫妻外,有一我的(1)只與(2N-2)握過手,有一我的(2N-3)和除了(0)之外的其它夫婦都握了手。這兩我的確定是一對夫妻,不然後者將和前者握手(從而前者的握手次數再也不是1)。以此類推,直到握過N-2次手的人和握過N次手的人配成一對。此時,除了男主人及其配偶之外,其他全部人都已經配對。根據排除法,最後剩下來的那個握手次數爲N-1的人就是女主人了。
十二、兩個機器人,初始時位於數軸上的不一樣位置。給這兩個機器人輸入一段相同的程序,使得這兩個機器人保證能夠相遇。程序只能包含「左移n個單位」、「右移n個單位」,條件判斷語句If,循環語句while,以及兩個返回Boolean值的函數「在本身的起點處」和「在對方的起點處」。你不能使用其它的變量和計數器。
答案:兩個機器人同時開始以單位速度右移,直到一個機器人走到另一個機器人的起點處。而後,該機器人以雙倍速度追趕對方。程序以下。
while(!at_other_robots_start) {
move_right 1
}
while(true) {
move_right 2
}
1三、 若是叫你從下面兩種遊戲中選擇一種,你選擇哪種?爲何?
a. 寫下一句話。若是這句話爲真,你將得到10美圓;若是這句話爲假,你得到的金錢將少於10美圓或多於10美圓(但不能剛好爲10美圓)。
b. 寫下一句話。無論這句話的真假,你都會獲得多於10美圓的錢。
答案:選擇第一種遊戲,並寫下「我既不會獲得10美圓,也不會獲得10000000美圓」。
1四、你在一幢100層大樓下,有21根電線線頭標有數字1..21。這些電線一直延伸到大樓樓頂,樓頂的線頭處標有字母A..U。你不知道下面的數字和上面的字母的對應關係。你有一個電池,一個燈泡,和許多很短的電線。如何只上下樓一次就能肯定電線線頭的對應關係?
答案:在下面把2,3連在一塊兒,把4到6全連在一塊兒,把7到10全連在一塊兒,等等,這樣你就把電線分紅了6個「等價類」,大小分別爲1, 2, 3, 4, 5, 6。而後到樓頂,測出哪根線和其它全部電線都不相連,哪些線和另一根相連,哪些線和另外兩根相連,等等,從而肯定出字母A..U各屬於哪一個等價類。如今,把每一個等價類中的第一個字母連在一塊兒,造成一個大小爲6的新等價類;再把後5個等價類中的第二個字母連在一塊兒,造成一個大小爲5的新等價類;以此類推。回到樓下,把新的等價類區別出來。這樣,你就知道了每一個數字對應了哪個原等價類的第幾個字母,從而解決問題。
1五、某種藥方要求很是嚴格,你天天須要同時服用A、B兩種藥片各一顆,不能多也不能少。這種藥很是貴,你不但願有任何一點的浪費。一天,你打開裝藥片A的藥瓶,倒出一粒藥片放在手心;而後打開另外一個藥瓶,但不當心倒出了兩粒藥片。如今,你手心上有一顆藥片A,兩顆藥片B,而且你沒法區別哪一個是A,哪一個是B。你如何才能嚴格遵循藥方服用藥片,而且不能有任何的浪費?
答案:把手上的三片藥各自切成兩半,分紅兩堆擺放。再取出一粒藥片A,也把它切成兩半,而後在每一堆里加上半片的A。如今,每一堆藥片剛好包含兩個半片的A和兩個半片的B。一天服用其中一堆便可。
1六、 你在一個飛船上,飛船上的計算機有n個處理器。忽然,飛船受到外星激光武器的攻擊,一些處理器被損壞了。你知道有超過一半的處理器仍然是好的。你能夠向一個處理器詢問另外一個處理器是好的仍是壞的。一個好的處理器老是說真話,一個壞的處理器老是說假話。用n-2次詢問找出一個好的處理器。
答案:給處理器從1到n標號。用符號a->b表示向標號爲a的處理器詢問處理器b是否是好的。首先問1->2,若是1說不是,就把他們倆都去掉(去掉了一個好的和一個壞的,則剩下的處理器中好的仍然過半),而後從3->4開始繼續發問。若是1說2是好的,就繼續問2->3,3->4,……直到某一次j說j+1是壞的,把j和j+1去掉,而後問j-1 -> j+2;或者從j+2 -> j+3開始發問,若是前面已經沒有j-1了(以前已經被去掉過了)。注意到你始終維護着這樣一個「鏈」,前面的每個處理器都說後面那個是好的。這條鏈裏的全部處理器要麼都是好的,要麼都是壞的。當這條鏈愈來愈長,剩下的處理器愈來愈少時,總有一個時候這條鏈超過了剩下的處理器的一半,此時能夠確定這條鏈裏的全部處理器都是好的。或者,愈來愈多的處理器都被去掉了,鏈的長度依舊爲0,而最後只剩下一個或兩個處理器沒被問過,那他們必定就是好的了。另外注意到,第一個處理器的好壞歷來沒被問過,仔細想一想你會發現最後一個處理器的好壞也不可能被問到(一旦鏈長超過剩餘處理器的一半,或者最後沒被去掉的就只剩這一個了時,你就不問了),所以詢問次數不會超過n-2。
1七、一個圓盤被塗上了黑白二色,兩種顏色各佔一個半圓。圓盤以一個未知的速度、按一個未知的方向旋轉。你有一種特殊的相機可讓你即時觀察到圓上的一個點的顏色。你須要多少個相機才能肯定圓盤旋轉的方向?
答案:你能夠把兩個相機放在圓盤上相近的兩點,而後觀察哪一個點先變色。事實上,只須要一個相機就夠了。控制相機繞圓盤中心順時針移動,觀察顏色多久變一次;而後讓相機以相同的速度逆時針繞着圓盤中心移動,再次觀察變色的頻率。能夠判定,變色頻率較慢的那一次,相機的轉動方向是和圓盤相同的。
1八、有25匹馬,速度都不一樣,但每匹馬的速度都是定值。如今只有5條賽道,沒法計時,即每賽一場最多隻能知道5匹馬的相對快慢。問最少賽幾場能夠找出25匹馬中速度最快的前3名?(百度2008年面試題)
每匹馬都至少要有一次參賽的機會,因此25匹馬分紅5組,一開始的這5場比賽是免不了的。接下來要找冠軍也很容易,每一組的冠軍在一塊兒賽一場就好了(第6場)。最後就是要找第2和第3名。咱們按照第6場比賽中獲得的名次依次把它們在前5場比賽中所在的組命名爲A、B、C、D、E。即:A組的冠軍是第6場的第1名,B組的冠軍是第6場的第2名……每一組的5匹馬按照他們已經賽出的成績從快到慢編號:
A組:1,2,3,4,5
B組:1,2,3,4,5
C組:1,2,3,4,5
D組:1,2,3,4,5
E組:1,2,3,4,5
從如今所獲得的信息,咱們能夠知道哪些馬已經被排除在3名之外。只要已經能肯定有3匹或3匹以上的馬比這匹馬快,那麼它就已經被淘汰了。能夠看到,只有上表中粗體藍色的那5匹馬纔有可能爲二、3名的。即:A組的二、3名;B組的一、2名,C組的第1名。取這5匹馬進行第7場比賽,第7場比賽的前兩名就是25匹馬中的二、3名。故一共最少要賽7場。
這道題有一些變體,好比64匹馬找前4名。方法是同樣的,在得出第1名之後尋找後3名的候選競爭者就能夠了。
1九、IBM筆試題:一普查員問一女人,「你有多少個孩子,他們多少歲?」
女人回答:「我有三個孩子,他們的歲數相乘是36,歲數相加就等於旁邊屋的門牌號碼。「普查員馬上走到旁邊屋,看了一看,回來講:「我還須要多少資料。」女人回答:「我如今很忙,我最大的孩子正在樓上睡覺。」普查員說:」謝謝,我己知道了。」
問題:那三個孩子的歲數是多少。
36 = 1 × 2 × 2 × 3 × 3
全部的可能爲
1,1,36;sum = 38
1,2,18;sum = 21
1,3,12;sum = 16
1,4,9;sum = 14
1,6,6;sum = 13
2,2,9;sum = 13
2,3,6;sum = 11
3,3,4;sum = 10
因爲普查員知道了年齡和以後仍是不能肯定每一個孩子的年齡,因此可能性爲
1,6,6;sum = 13
2,2,9;sum = 13
因爲最大(暗含只有一個最大)的孩子在睡覺,因此只多是
2,2,9;sum = 13
20、有7克、2克砝碼各一個,天平一隻,如何只用這些物品三次將140克的鹽分紅50、90克各一份?
答:第一步:把140克鹽分紅兩等份,每份70克。
第二步:把天平一邊放上2+7克砝碼,另外一邊放鹽,這樣就獲得9克和61克分開的鹽。
第三步:將9克鹽和2克砝碼放在天平一邊,另外一邊放鹽,這樣就獲得11克和50克。因而50和90就分開了。
2一、有三筐水果,一筐裝的全是蘋果,第二筐裝的全是橘子,第三筐是橘子與蘋果混在一塊兒。筐上的標籤都是騙人的,(好比,若是標籤寫的是橘子,那麼能夠確定筐裏不會只有橘子,可能還有蘋果)你的任務是拿出其中一筐,從裏面只拿一隻水果,而後正確寫出三筐水果的標籤。
答:從貼有蘋果和橘子標籤的筐中拿出一個水果,若是是蘋果,說明這個筐中全是蘋果,那麼貼蘋果標籤的筐裏裝的全是桔子,則貼有桔子標籤的筐中裝的蘋果和桔子;若是拿出的一個水果是桔子,說明這個筐中全是桔子,那麼貼桔子標籤的筐裏裝的全是蘋果,貼蘋果標籤的筐裏裝的是蘋果和桔子。
2二、題目以下:
0 1 2 3 4 5 6 7 8 9
_ _ _ _ _ _ _ _ _ _
在橫線上填寫數字,使之符合要求。
要求以下:對應的數字下填入的數,表明上面的數在下面出現的次數,好比3下面是1,表明3要在下面出現一次。
正確答案是:0 1 2 3 4 5 6 7 8 9
6 2 1 0 0 0 1 0 0 0
個人思路是:由於第二行的數字是第一行的數在下面出現的次數,下面10個格子,總共10次。。。因此第2排數字之和爲10。
首先從0入手,先填9,確定不可能,9下面要是1,只剩8個位填0,不夠填8,8下面要填1,1要至少填2,後面不用再想,由於已經剩下7個位置,不夠填0……如此類推。到0下面填6的時候就獲得我上面的答案了。。
其實能夠推出這個題目的兩個關鍵條件:
一、第2排數字之和爲10。
二、兩排數字上下相乘之和也是10!
知足這兩個條件的就是答案,下面來編寫程序實現!
1 //原始數值: 0,1,2,3,4,5,6,7,8,9 2 //出現次數: 6,2,1,0,0,0,1,0,0,0 3 #include "iostream" 4 using namespace std; 5 #define len 10 6 class NumberTB 7 { 8 private: 9 int top[len]; 10 int bottom[len]; 11 bool success; 12 public: 13 NumberTB(); 14 int *getBottom(); 15 void setNextBottom(); 16 int getFrequecy(int num); 17 }; 18 NumberTB::NumberTB() 19 { 20 success = false; 21 //format top 22 for(int i = 0; i < len; i++) 23 { 24 top[i] = i; 25 } 26 } 27 int *NumberTB::getBottom() 28 { 29 int i = 0; 30 while(!success) 31 { 32 i++; 33 setNextBottom(); 34 } 35 return bottom; 36 } 37 //set next bottom 38 void NumberTB::setNextBottom() 39 { 40 bool reB = true; 41 for(int i = 0; i < len; i++) 42 { 43 int frequecy = getFrequecy(i); 44 if(bottom[i] != frequecy) 45 { 46 bottom[i] = frequecy; 47 reB = false; 48 } 49 } 50 success = reB; 51 } 52 //get frequency in bottom 53 int NumberTB::getFrequecy(int num) //此處的num 即指上排的數i 54 { 55 int count = 0; 56 for(int i = 0; i < len; i++) 57 { 58 if(bottom[i] == num) 59 count++; 60 } 61 return count; //cout 即對應frequecy 62 } 63 int main(void) 64 { 65 int i; 66 NumberTB nTB; 67 int *result = nTB.getBottom(); 68 cout<<"原始數值:"; 69 for(i=0;i<10;i++) 70 cout<<i<<" "; 71 cout<<endl; 72 cout<<"出現次數:"; 73 for(i = 0; i < len; i++) 74 { 75 cout << *result++ <<" "; 76 } 77 cout<<endl; 78 system("pause"); 79 return 0; 80 }