偶然在訂閱號中看到一些校招的智力題,以爲有點意思,因而花了些時間收集一些,網上搜了下,在此mark下~~數組
解法:有時候,嚴格的限制條件有可能反卻是解題的線索。在這個問題中,限制條件是天平只能用一次。由於天平只能用一次,咱們也得以知道一個有趣的事實:一次必須同時稱不少藥丸,其實更準確地說,是必須從19瓶拿出藥丸進行稱重。不然,若是跳過兩瓶或更多瓶藥丸,又該如何區分沒稱過的那幾瓶呢?別忘了,天平只能用一次。安全
那麼,該怎麼稱重取自多個藥瓶的藥丸,並肯定哪一瓶裝有比較重的藥丸?假設只有兩瓶藥丸,其中一瓶的藥丸比較重。每瓶取出一粒藥丸,稱得重量爲2.1克,但無從知道這多出來的0.1克來自哪一瓶。咱們必須設法區分這些藥瓶。負載均衡
若是從藥瓶#1取出一粒藥丸,從藥瓶#2取出兩粒藥丸,那麼,稱得重量爲多少呢?結果要看狀況而定。若是藥瓶#1的藥丸較重,則稱得重量爲3.1克。若是藥瓶#2的藥丸較重,則稱得重量爲3.2克。這就是這個問題的解題竅門。設計
稱一堆藥丸時,咱們會有個「預期」重量。而藉由預期重量和實測重量之間的差異,就能得出哪一瓶藥丸比較重,前提是從每一個藥瓶取出不一樣數量的藥丸。遊戲
將以前兩瓶藥丸的解法加以推廣,就能獲得完整解法:從藥瓶#1取出一粒藥丸,從藥瓶#2取出兩粒,從藥瓶#3取出三粒,依此類推。若是每粒藥丸均重1克,則稱得總重量爲210克(1 + 2 + … + 20 = 20 * 21 / 2 = 210),「多出來的」重量一定來自每粒多0.1克的藥丸。藥瓶的編號可由算式(weight – 210 grams) / 0.1 grams得出。所以,若這堆藥丸稱得重量爲211.3克,則藥瓶#13裝有較重的藥丸。字符串
2.有個8×8棋盤,其中對角的角落上,兩個方格被切掉了。給定31塊多米諾骨牌,一塊骨牌剛好能夠覆蓋兩個方格。用這31塊骨牌可否蓋住整個棋盤?請證實你的答案(提供範例,或證實爲何不可能)。數學
解法:乍一看,彷佛是能夠蓋住的。棋盤大小爲8×8,共有64個方格,但其中兩個方格已被切掉,所以只剩62個方格。31塊骨牌應該恰好能蓋住整個棋盤,對吧?
嘗試用骨牌蓋住第1行,而第1行只有7個方格,所以有一塊骨牌必須鋪至第2行。而用骨牌蓋住第2行時,咱們又必須將一塊骨牌鋪至第3行。要蓋住每一行,總有一塊骨牌必須鋪至下一行。不管嘗試多少次、多少種方法,咱們都沒法成功鋪下全部骨牌。
其實,還有更簡潔更嚴謹的證實說明爲何不可能。棋盤本來有32個黑格和32個白格。將對角角落上的兩個方格(相同顏色)切掉,棋盤只剩下30個同色的方格和32個另外一種顏色的方格。爲方便論證起見,咱們假定棋盤上剩下30個黑格和32個白格。放在棋盤上的每塊骨牌一定會蓋住一個白格和一個黑格。所以,31塊骨牌正好蓋住31個白格和31個黑格。然而,這個棋盤只有30個黑格和32個白格,因此,31塊骨牌蓋不住整個棋盤。計算機科學
3.有兩個水壺,容量分別爲5夸脫(美製:1夸脫=0.946升,英制:1夸脫=1.136升)和3夸脫,若水的供應不限量(但沒有量杯),怎麼用這兩個水壺獲得恰好4夸脫的水?注意,這兩個水壺呈不規則形狀,沒法精準地裝滿「半壺」水。循環
解法二進制
根據題意,咱們只能使用這兩個水壺,不妨隨意把玩一番,把水倒來倒去,能夠獲得以下順序組合:
注意,許多智力題其實都隱含數學或計算機科學的背景,這個問題也不例外。只要這兩個水壺的容量互質(即兩個數沒有共同的質因子),咱們就能找出一種倒水的順序組合,量出1到2個水壺容量總和(含)之間的任意水量。
4.有個島上住着一羣人,有一天來了個遊客,定了一條奇怪的規矩:全部藍眼睛的人都必須儘快離開這個島。每晚8點會有一個航班離島。每一個人都看得見別人眼睛的顏色,但不知道本身的(別人也不能夠告知)。此外,他們不知道島上到底有多少人是藍眼睛的,只知道至少有一我的的眼睛是藍色的。全部藍眼睛的人要花幾天才能離開這個島?
解法:下面將採用簡單構造法。假定這個島上一共有n人,其中c人有藍眼睛。由題目可知,c > 0。
- 狀況c = 1:只有一人是藍眼睛的
假設島上全部人都是聰明的,藍眼睛的人四處觀察以後,發現沒有人是藍眼睛的。但他知道至少有一人是藍眼睛的,因而就能推導出本身必定是藍眼睛的。所以,他會搭乘當晚的飛機離開。
2.狀況c = 2:只有兩人是藍眼睛的
兩個藍眼睛的人看到對方,並不肯定c是1仍是2,可是由上一種狀況,他們知道,若是c = 1,那個藍眼睛的人第一晚就會離島。所以,發現另外一個藍眼睛的人仍在島上,他必定能推斷出c = 2,也就意味着他本身也是藍眼睛的。因而,兩個藍眼睛的人都會在第二晚離島。
3.狀況c > 2:通常狀況
逐步提升c時,咱們能夠看出上述邏輯仍舊適用。若是c = 3,那麼,這三我的會當即意識到有2到3人是藍眼睛的。若是有兩人是藍眼睛的,那麼這兩人會在第二晚離島。所以,若是過了第二晚另外兩人還在島上,每一個藍眼睛的人都能推斷出c = 3,所以這三人都有藍眼睛。他們會在第三晚離島。
不論c爲何值,均可以套用這個模式。因此,若是有c人是藍眼睛的,則全部藍眼睛的人要用c晚才能離島,且都在同一晚離開。
5.有棟建築物高100層。若從第N層或更高的樓層扔下來,雞蛋就會破掉。若從第N層如下的樓層扔下來則不會破掉。給你2個雞蛋,請找出N,並要求最差狀況下扔雞蛋的次數爲最少。
解法:咱們發現,不管怎麼扔雞蛋1(Egg 1),雞蛋2(Egg 2)都必須在「破掉那一層」和下一個不會破掉的最高樓層之間,逐層扔下樓(從最低的到最高的)。例如,若雞蛋1從5層和10層樓扔下沒破掉,但從15層扔下時破掉了,那麼,在最差狀況下,雞蛋2必須嘗試從十一、十二、13和14層扔下樓。
具體作法:
首先,讓咱們試着從10層開始扔雞蛋,而後是20層,等等。
若是雞蛋1第一次扔下樓(10層)就破掉了,那麼,最多須要扔10次。
若是雞蛋1最後一次扔下樓(100層)才破掉,那麼,最多要扔19次(十、20、…、90、100層,而後是91到99層)。
這麼作也挺不錯,但咱們只考慮了絕對最差狀況。咱們應該進行「負載均衡」,讓這兩種狀況下扔雞蛋的次數更均勻。
咱們的目標是設計一種扔雞蛋的方法,使得扔雞蛋1時,不管是在第一次仍是最後一次扔下樓才破掉,次數越穩定越好。
(1) 完美負載均衡的方法應該是,扔雞蛋1的次數加上扔雞蛋2的次數,不論何時都同樣,無論雞蛋1是從哪層樓扔下時破掉的。
(2) 如有這種扔法,每次雞蛋1多扔一次,雞蛋2就能夠少扔一次。
(3) 所以,每丟一次雞蛋1,就應該減小雞蛋2可能須要扔下樓的次數。例如,若是雞蛋1先從20層往下扔,而後從30層扔下樓,此時雞蛋2可能就要扔9次。若雞蛋1再扔一次,咱們必須讓雞蛋2扔下樓的次數降爲8次。也就是說,咱們必須讓雞蛋1從39層扔下樓。
(4) 由此可知,雞蛋1必須從X層開始往下扔,而後再往上增長X1層……直至到達100層。
(5) 求解方程式X + (X1) + (X2) + … + 1 = 100,獲得X (X + 1) / 2 = 100 → X = 14。
咱們先從14層開始,而後是27層,接着是39層,依此類推,最差狀況下雞蛋要扔14次。
正如解決其餘許多最大化/最小化的問題同樣,這類問題的關鍵在於「平衡最差狀況」。
6.走廊上有100個關上的儲物櫃。有我的先是將100個櫃子全都打開。接着,每數兩個櫃子關上一個。而後,在第三輪時,再每隔兩個就切換第三個櫃子的開關狀態(也就是將關上的櫃子打開,將打開的關上)。照此規律反覆操做100次,在第i輪,這我的會每數i個就切換第i個櫃子的狀態。當第100輪通過走廊時,只切換第100個櫃子的開關狀態,此時有幾個櫃子是開着的?
解法:要解決這個問題,咱們必須弄清楚所謂切換儲物櫃開關狀態是什麼意思。這有助於咱們推斷最終哪些櫃子是開着的。
- 問題:櫃子會在哪幾輪切換狀態(開或關)?
櫃子n會在n的每一個因子(包括1和n自己)對應的那一輪切換狀態。也就是說,櫃子15會在第一、三、5和15輪開或關一次。
- 問題:櫃子何時仍是開着的?
若是因子個數(記做x)爲奇數,則這個櫃子是開着的。你能夠把一對因子比做開和關,若還剩一個因子,則櫃子就是開着的。
- 問題:x何時爲奇數?
若n爲徹底平方數,則x的值爲奇數。理由以下:將n的兩個互補因子配對。例如,如n爲36,則因子配對狀況爲:(1, 36)、(2, 18)、(3, 12)、(4, 9)、(6, 6)。注意,(6, 6)其實只有一個因子,所以n的因子個數爲奇數。
- 問題:有多少個徹底平方數?
一共有10個徹底平方數,你能夠數一數(一、四、九、1六、2五、3六、4九、6四、8一、100),或者,直接列出1到10的平方:
1 * 1, 2 * 2, 3 * 3, …, 10*10
所以,最後共有10個櫃子是開着的。
7.考慮一個雙人遊戲。遊戲在一個圓桌上進行。每一個遊戲者都有足夠多的硬幣。他們須要在桌子上輪流放置硬幣,每次必需且只能放置一枚硬幣,要求硬幣徹底置於桌面內(不能有一部分懸在桌子外面),而且不能與原來放過的硬幣重疊。誰沒有地方放置新的硬幣,誰就輸了。遊戲的先行者仍是後行者有必勝策略?這種策略是什麼?
答案:先行者在桌子中心放置一枚硬幣,之後的硬幣老是放在與後行者剛纔放的地方相對稱的位置。這樣,只要後行者能放,先行者必定也有地方放。先行者必勝。
8.用線性時間和常數附加空間將一篇文章的單詞(不是字符)倒序。
答案:先將整篇文章的全部字符逆序(從兩頭起不斷交換位置相對稱的字符);而後用一樣的辦法將每一個單詞內部的字符逆序。這樣,整篇文章的單詞順序顛倒了,但單詞自己又被轉回來了。
9.用線性時間和常數附加空間將一個長度爲n的字符串向左循環移動m位(例如,」abcdefg」移動3位就了」defgabc」)。
答案:把字符串切成長爲m和n-m的兩半。將這兩個部分分別逆序,再對整個字符串逆序。
10.** 一個矩形蛋糕,蛋糕內部有一塊矩形的空洞。只用一刀,如何將蛋糕切成大小相等的兩塊?**
答案:注意到平分矩形面積的線都通過矩形的中心。過大矩形和空心矩形各自的中心畫一條線,這條線顯然把兩個矩形都分紅了一半,它們的差固然也是相等的。
11.一塊矩形的巧克力,初始時由N x M個小塊組成。每一次你只能把一塊巧克力掰成兩個小矩形。最少須要幾回才能把它們掰成N x M塊1×1的小巧克力?
答案:N x M – 1次顯然足夠了。這個數目也是必需的,由於每掰一次後當前巧克力的塊數只能增長一,把巧克力分紅N x M塊固然須要至少掰N x M – 1次。
12.如何快速找出一個32位整數的二進制表達裏有多少個」1″?用關於」1″的個數的線性時間?
答案1(關於數字位數線性):for(n=0; b; b >>= 1) if (b & 1) n++;
答案2(關於」1″的個數線性):for(n=0; b; n++) b &= b-1;
13.** 一個大小爲N的數組,全部數都是不超過N-1的正整數。用O(N)的時間找出重複的那個數(假設只有一個)。一個大小爲N的數組,全部數都是不超過N+1的正整數。用O(N)的時間找出沒有出現過的那個數(假設只有一個)。**
答案:計算數組中的全部數的和,再計算出從1到N-1的全部數的和,二者之差即爲重複的那個數。計算數組中的全部數的和,再計算出從1到N+1的全部數的和,二者之差即爲缺乏的那個數。
14.給出一行C語言表達式,判斷給定的整數是不是一個2的冪。
答案:(b & (b-1)) == 0
15.地球上有多少個點,使得從該點出發向南走一英里,向東走一英里,再向北走一英里以後剛好回到了起點?
答案:「北極點」是一個傳統的答案,其實這個問題還有其它的答案。事實上,知足要求的點有無窮多個。全部距離南極點1 + 1/(2π)英里的地方都是知足要求的,向南走一英里後到達距離南極點1/(2π)的地方,向東走一英里後正好繞行緯度圈一週,再向北走原路返回到起點。事實上,這仍然不是知足要求的所有點。距離南極點1 + 1/(2kπ)的地方都是能夠的,其中k能夠是任意一個正整數。
16.A、B兩人分別在兩座島上。B生病了,A有B所須要的藥。C有一艘小船和一個能夠上鎖的箱子。C願意在A和B之間運東西,但東西只能放在箱子裏。只要箱子沒被上鎖,C都會偷走箱子裏的東西,無論箱子裏有什麼。若是A和B各自有一把鎖和只能開本身那把鎖的鑰匙,A應該如何把東西安全遞交給B?
答案:A把藥放進箱子,用本身的鎖把箱子鎖上。B拿到箱子後,再在箱子上加一把本身的鎖。箱子運回A後,A取下本身的鎖。箱子再運到B手中時,B取下本身的鎖,得到藥物。
17.一對夫婦邀請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的人就是女主人了。