整理III 微軟等資料結構+演算法面試100題 最新第61-80題
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
精選微軟等資料結構+演算法面試100題[第61-80題]
昨日,11.19,最新整理了,第61-80題,現在公佈。
可以這麼說,絕大部分的面試題,都是這100道題系列的翻版,
此微軟等公司資料結構+演算法面試100題系列,是極具代表性的經典面試題。
我曾經暗暗問自己,不知道我是否把面試題基本上都蒐集整理盡了,
而當然,對你更重要的是,我自個還提供了答案下載,提供思路,呵。
所以,這份資料+答案,在網上是獨一無二的。
閒不多說,接下來,你可以盡情的享用了,朋友。
現在首次公佈整理的第61-80題(11.19最新整理公佈):
---------------------------------------
[整理I]精選微軟等公司資料結構+演算法面試100題 [第1-40題] (博文)
http://blog.csdn.net/v_JULY_v/archive/2010/10/27/5968678.aspx
[整理II]精選微軟等公司資料結構+演算法面試100題 [第41-60題] (博文)
http://blog.csdn.net/v_JULY_v/archive/2010/10/29/5975019.aspx
[彙總I]精選微軟等公司資料結構+演算法面試100題[第1-60題彙總](博文)
http://blog.csdn.net/v_JULY_v/archive/2010/11/12/6004660.aspx
61.找出陣列中兩個只出現一次的數字
題目:一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次。
請寫程式找出這兩個只出現一次的數字。要求時間複雜度是O(n),空間複雜度是O(1)。
分析:這是一道很新穎的關於位運算的面試題。
62.找出連結串列的第一個公共結點。
題目:兩個單向連結串列,找出它們的第一個公共結點。
連結串列的結點定義為:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
分析:這是一道微軟的面試題。
微軟非常喜歡與連結串列相關的題目,因此在微軟的面試題中,連結串列出現的概率相當高。
63.在字串中刪除特定的字元。
題目:輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。
例如,輸入”They are students.”和”aeiou”,則刪除之後的第一個字串變成”Thy r stdnts.”。
分析:這是一道微軟面試題。在微軟的常見面試題中,與字串相關的題目佔了很大的一部分,
因為寫程式操作字串能很好的反映我們的程式設計基本功。
64. 尋找醜數。
題目:我們把只包含因子2、3和5的數稱作醜數(Ugly Number)。
例如6、8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第一個醜數。
求按從小到大的順序的第1500個醜數。
分析:這是一道在網路上廣為流傳的面試題,據說google曾經採用過這道題。
65.輸出1到最大的N位數
題目:輸入數字n,按順序輸出從1最大的n位10進位制數。
比如輸入3,則輸出1、2、3一直到最大的3位數即999。
分析:這是一道很有意思的題目。看起來很簡單,其實裡面卻有不少的玄機。
66.顛倒棧。
題目:用遞迴顛倒一個棧。例如輸入棧{1, 2, 3, 4, 5},1在棧頂。
顛倒之後的棧為{5, 4, 3, 2, 1},5處在棧頂。
67.倆個閒玩娛樂。
1.撲克牌的順子
從撲克牌中隨機抽5張牌,判斷是不是一個順子,即這5張牌是不是連續的。
2-10為數字本身,A為1,J為11,Q為12,K為13,而大小王可以看成任意數字。
2.n個骰子的點數。
把n個骰子扔在地上,所有骰子朝上一面的點數之和為S。
輸入n,打印出S的所有可能的值出現的概率。
68.把陣列排成最小的數。
題目:輸入一個正整數陣列,將它們連線起來排成一個數,輸出能排出的所有數字中最小的一個。
例如輸入陣列{32, 321},則輸出這兩個能排成的最小數字32132。
請給出解決問題的演算法,並證明該演算法。
分析:這是09年6月份百度的一道面試題,
從這道題我們可以看出百度對應聘者在演算法方面有很高的要求。
69.旋轉陣列中的最小元素。
題目:把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入一個排好序的陣列的一個旋轉,輸出旋轉陣列的最小元素。
例如陣列{3, 4, 5, 1, 2}為{1, 2, 3, 4, 5}的一個旋轉,該陣列的最小值為1。
分析:這道題最直觀的解法並不難。從頭到尾遍歷陣列一次,就能找出最小的元素,
時間複雜度顯然是O(N)。但這個思路沒有利用輸入陣列的特性,我們應該能找到更好的解法。
70.給出一個函式來輸出一個字串的所有排列。
分析:簡單的回溯就可以實現了。當然排列的產生也有很多種演算法,去看看組合數學,
還有逆序生成排列和一些不需要遞迴生成排列的方法。
印象中Knuth的<TAOCP>第一卷裡面深入講了排列的生成。
這些演算法的理解需要一定的數學功底,
也需要一定的靈感,有興趣最好看看。
71.數值的整數次方。
題目:實現函式double Power(double base, int exponent),求base的exponent次方。
不需要考慮溢位。
分析:這是一道看起來很簡單的問題。可能有不少的人在看到題目後30秒寫出如下的程式碼:
double Power(double base, int exponent)
{
double result = 1.0;
for(int i = 1; i <= exponent; ++i)
result *= base;
return result;
}
72.
題目:設計一個類,我們只能生成該類的一個例項。
分析:只能生成一個例項的類是實現了Singleton模式的型別。
73.對策字串的最大長度。
題目:輸入一個字串,輸出該字串中對稱的子字串的最大長度。
比如輸入字串“google”,由於該字串裡最長的對稱子字串是“goog”,因此輸出4。
分析:可能很多人都寫過判斷一個字串是不是對稱的函式,這個題目可以看成是該函式的加強版。
74.陣列中超過出現次數超過一半的數字
題目:陣列中有一個數字出現的次數超過了陣列長度的一半,找出這個數字。
分析:這是一道廣為流傳的面試題,包括百度、微軟和Google在內的多家公司
都曾經採用過這個題目。要幾十分鐘的時間裡很好地解答這道題,除了較好的程式設計能力之外,
還需要較快的反應和較強的邏輯思維能力。
75.二叉樹兩個結點的最低共同父結點
題目:二叉樹的結點定義如下:
struct TreeNode
{
int m_nvalue;
TreeNode* m_pLeft;
TreeNode* m_pRight;
};
輸入二叉樹中的兩個結點,輸出這兩個結點在數中最低的共同父結點。
分析:求數中兩個結點的最低共同結點是面試中經常出現的一個問題。這個問題至少有兩個變種。
76.複雜連結串列的複製
題目:有一個複雜連結串列,其結點除了有一個m_pNext指標指向下一個結點外,
還有一個m_pSibling指向連結串列中的任一結點或者NULL。其結點的C++定義如下:
struct ComplexNode
{
int m_nValue;
ComplexNode* m_pNext;
ComplexNode* m_pSibling;
};
下圖是一個含有5個結點的該型別複雜連結串列。
圖中實線箭頭表示m_pNext指標,虛線箭頭表示m_pSibling指標。
為簡單起見,指向NULL的指標沒有畫出。
請完成函式ComplexNode* Clone(ComplexNode* pHead),以複製一個複雜連結串列。
//圖,接下來,自會補上。July、11.19.
分析:在常見的資料結構上稍加變化,這是一種很新穎的面試題。
要在不到一個小時的時間裡解決這種型別的題目,
我們需要較快的反應能力,對資料結構透徹的理解以及紮實的程式設計功底。
77.關於連結串列問題的面試題目如下:
題一、 給定單鏈表,檢測是否有環。
使用兩個指標p1,p2從連結串列頭開始遍歷,p1每次前進一步,p2每次前進兩步。
如果p2到達連結串列尾部,說明無環,否則p1、p2必然會在某個時刻相遇(p1==p2),從而檢測到連結串列中有環。
題二、 給定兩個單鏈表(head1, head2),檢測兩個連結串列是否有交點,如果有返回第一個交點。
如果head1==head2,那麼顯然相交,直接返回head1。
否則,分別從head1,head2開始遍歷兩個連結串列獲得其長度len1與len2,假設len1>=len2,
那麼指標p1由head1開始向後移動len1-len2步,指標p2=head2,
下面p1、p2每次向後前進一步並比較p1p2是否相等,如果相等即返回該結點,
否則說明兩個連結串列沒有交點。
題三、 給定單鏈表(head),如果有環的話請返回從頭結點進入環的第一個節點。
運用題一,我們可以檢查連結串列中是否有環。
如果有環,那麼p1p2重合點p必然在環中。從p點斷開環,方法為:p1=p, p2=p->next,
p->next=NULL。此時,原單鏈表可以看作兩條單鏈表,一條從head開始,另一條從p2開始,
於是運用題二的方法,我們找到它們的第一個交點即為所求。
題四、只給定單鏈表中某個結點p(並非最後一個結點,即p->next!=NULL)指標,刪除該結點。
辦法很簡單,首先是放p中資料,然後將p->next的資料copy入p中,接下來刪除p->next即可。
題五、只給定單鏈表中某個結點p(非空結點),在p前面插入一個結點。
辦法與前者類似,首先分配一個結點q,將q插入在p後,
接下來將p中的資料copy入q中,然後再將要插入的資料記錄在p中。
78.連結串列和陣列的區別在哪裡?
分析:主要在基本概念上的理解。
但是最好能考慮的全面一點,現在公司招人的競爭可能就在細節上產生,
誰比較仔細,誰獲勝的機會就大。
79.
1.編寫實現連結串列排序的一種演算法。說明為什麼你會選擇用這樣的方法?
2.編寫實現陣列排序的一種演算法。說明為什麼你會選擇用這樣的方法?
3.請編寫能直接實現strstr()函式功能的程式碼。
80.阿里巴巴一道筆試題
引自baihacker
問題描述:
12個高矮不同的人,排成兩排,每排必須是從矮到高排列,而且第二排比對應的第一排的人高,問排列方式有多少種?
這個筆試題,很YD,因為把某個遞迴關係隱藏得很深.
//第81-100題正在整理中。
---------------------------------------------------------------------------------------
整理資源下載地址:
題目系列:
1.[最新整理公佈][彙總II]微軟等資料結構+演算法面試100題[第1-80題]
http://download.csdn.net/source/2846055
2.[第一部分]精選微軟等公司資料結構+演算法經典面試100題[1-40題]
http://download.csdn.net/source/2778852
3.[第二部分]精選微軟等公司結構+演算法面試100題[前41-60題]:
http://download.csdn.net/source/2811703
4.[第1題-60題彙總]微軟等資料結構+演算法面試100題
http://download.csdn.net/source/2826690
答案系列:
5.[最新答案V0.3版]微軟等資料結構+演算法面試100題[第21-40題答案]
http://download.csdn.net/source/2832862
6.[答案V0.2版]精選微軟資料結構+演算法面試100題[前20題]--修正
http://download.csdn.net/source/2813890
//此份答案是針對最初的V0.1版本,進行的校正與修正。
7.[答案V0.1版]精選微軟資料結構+演算法面試100題[前25題]
http://download.csdn.net/source/2796735
更多資源,下載地址:
http://v_july_v.download.csdn.net/
謝謝。
---------------------------------------
各位,我已經針對本100題, 開了一帖,作為本微軟等100題系列的永久維護地址。
真誠歡迎,各位,前去帖子上,寫下對這100道題中任何一題的思路或想法。
帖子地址:
橫空出世,席捲Csdn:記微軟等100題系列數次被薦[100題維護地址] 11.26日
http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html
本人July對以上所有任何內容和資料享有版權,轉載請註明出處。
向你的厚道致敬。謝謝。
2010年11月22日。