1. 程式人生 > >整理III 微軟等資料結構+演算法面試100題 最新第61-80題

整理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日。
    

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述