數據結構面試題

轉載自July。致謝。
 
 
1.把二元查找樹轉變成排序的雙向鏈表
 題目:
輸入一棵二元查找樹,將該二元查找樹轉換成一個排序的雙向鏈表。
要求不能建立任何新的結點,只調整指針的指向。
   10
 / \
 6 14
 / \ / \
4 8 12 16
 轉換成雙向鏈表
4=6=8=10=12=14=16。
 
 首先咱們定義的二元查找樹 節點的數據結構以下:
 struct BSTreeNode
{
 int m_nValue; // value of node
 BSTreeNode *m_pLeft; // left child of node
 BSTreeNode *m_pRight; // right child of node
};
 
 
2.設計包含min函數的棧。
定義棧的數據結構,要求添加一個min函數,可以獲得棧的最小元素。
要求函數min、push以及pop的時間複雜度都是O(1)。
 
 
 
 
3.求子數組的最大和
題目:
輸入一個整形數組,數組裏有正數也有負數。
數組中連續的一個或多個整數組成一個子數組,每一個子數組都有一個和。
求全部子數組的和的最大值。要求時間複雜度爲O(n)。
 
例如輸入的數組爲1, -2, 3, 10, -4, 7, 2, -5,和最大的子數組爲3, 10, -4, 7, 2,
所以輸出爲該子數組的和18。
 
 
 
4.在二元樹中找出和爲某一值的全部路徑
 
題目:輸入一個整數和一棵二元樹。
從樹的根結點開始往下訪問一直到葉結點所通過的全部結點造成一條路徑。
打印出和與輸入整數相等的全部路徑。
例如 輸入整數22和以下二元樹
 10 
 / \  
 5 12  
 /   \  
4     7
則打印出兩條路徑:10, 12和10, 5, 7。
 
二元樹節點的數據結構定義爲:
struct BinaryTreeNode // a node in the binary tree
{
int m_nValue; // value of node
BinaryTreeNode *m_pLeft; // left child of node
BinaryTreeNode *m_pRight; // right child of node
};
 
 
 
5.查找最小的k個元素
題目:輸入n個整數,輸出其中最小的k個。
例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字爲1,2,3和4。
 
 
 
 
第6題
騰訊面試題:
給你10分鐘時間,根據上排給出十個數,在其下排填出對應的十個數
要求下排每一個數都是先前上排那十個數在下排出現的次數。
上排的十個數以下:
【0,1,2,3,4,5,6,7,8,9】
 
舉一個例子,
數值: 0,1,2,3,4,5,6,7,8,9
分配: 6,2,1,0,0,0,1,0,0,0
0在下排出現了6次,1在下排出現了2次,
2在下排出現了1次,3在下排出現了0次....
以此類推..
 
 
第7題
微軟亞院之編程判斷倆個鏈表是否相交
給出倆個單向鏈表的頭指針,好比h1,h2,判斷這倆個鏈表是否相交。
爲了簡化問題,咱們假設倆個鏈表均不帶環。
 
問題擴展:
1.若是鏈表可能有環列?
2.若是須要求出倆個鏈表相交的第一個節點列?
 
 
第8題
此貼選一些 比較怪的題,,因爲其中題目自己與算法關係不大,僅考考思惟。特此並做一題。
1.有兩個房間,一間房裏有三盞燈,另外一間房有控制着三盞燈的三個開關,
 
這兩個房間是 分割開的,從一間裏不能看到另外一間的狀況。
如今要求受訓者分別進這兩房間一次,而後判斷出這三盞燈分別是由哪一個開關控制的。
有什麼辦法呢?
 
2.你讓一些人爲你工做了七天,你要用一根金條做爲報酬。金條被分紅七小塊,天天給出一塊。
若是你只能將金條切割兩次,你怎樣分給這些工人?
 
3. ★用一種算法來顛倒一個連接表的順序。如今在不用遞歸式的狀況下作一遍。
  ★用一種算法在一個循環的連接表裏插入一個節點,但不得穿越連接表。
  ★用一種算法整理一個數組。你爲何選擇這種方法?
  ★用一種算法使通用字符串相匹配。
  ★顛倒一個字符串。優化速度。優化空間。
  ★顛倒一個句子中的詞的順序,好比將「我叫克麗絲」轉換爲「克麗絲叫我」,
 
實現速度最快,移動最少。
  ★找到一個子字符串。優化速度。優化空間。
  ★比較兩個字符串,用O(n)時間和恆量空間。
   ★假設你有一個用1001個整數組成的數組,這些整數是任意排列的,可是你知道全部的整數都在1到1000(包括1000)之間。此外,除一個數字出現 兩次外,其餘全部數字只出現一次。假設你只能對這個數組作一次處理,用一種算法找出重複的那個數字。若是你在運算中使用了輔助的存儲方式,那麼你能找到不 用這種方式的算法嗎?
  ★不用乘法或加法增長8倍。如今用一樣的方法增長7倍。
 
 
 
 
第9題
判斷整數序列是否是二元查找樹的後序遍歷結果
題目:輸入一個整數數組,判斷該數組是否是某二元查找樹的後序遍歷的結果。
若是是返回true,不然返回false。
 
例如輸入五、七、六、九、十一、十、8,因爲這一整數序列是以下樹的後序遍歷結果:
         8
      / \
     6    10
    / \ / \
   5 7 9 11
所以返回true。
若是輸入七、四、六、5,沒有哪棵樹的後序遍歷的結果是這個序列,所以返回false。
 
 
 
第10題
翻轉句子中單詞的順序。
題目:輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。
 
句子中單詞以空格符隔開。爲簡單起見,標點符號和普通字母同樣處理。
例如輸入「I am a student.」,則輸出「student. a am I」。
 
 
第11題
求二叉樹中節點的最大距離...
 
若是咱們把二叉樹當作一個圖,父子節點之間的連線當作是雙向的,
咱們姑且定義"距離"爲兩節點之間邊的個數。
寫一個程序,
求一棵二叉樹中相距最遠的兩個節點之間的距離。
 
 
 
第12題
題目:求1+2+…+n,
要求不能使用乘除法、for、while、if、else、switch、case等關鍵字以及條件判斷語句(A?B:C)。
 
 
 
第13題:
題目:輸入一個單向鏈表,輸出該鏈表中倒數第k個結點。鏈表的倒數第0個結點爲鏈表的尾指針。
鏈表結點定義以下: 
struct ListNode
{
 int m_nKey;
 ListNode* m_pNext;
};
 
 
 
第14題:
題目:輸入一個已經按升序排序過的數組和一個數字,
在數組中查找兩個數,使得它們的和正好是輸入的那個數字。
要求時間複雜度是O(n)。若是有多對數字的和等於輸入的數字,輸出任意一對便可。
例如輸入數組一、二、四、七、十一、15和數字15。因爲4+11=15,所以輸出4和11。
 
 
 
第15題:
題目:輸入一顆二元查找樹,將該樹轉換爲它的鏡像,
即在轉換後的二元查找樹中,左子樹的結點都大於右子樹的結點。
用遞歸和循環兩種方法完成樹的鏡像轉換。 
例如輸入:
 8
 / \
 6 10
 /\ /\
5 7 9 11
 
輸出:
 8
 / \
 10 6
 /\ /\
11 9 7 5
 
定義二元查找樹的結點爲:
struct BSTreeNode // a node in the binary search tree (BST)
{
 int m_nValue; // value of node
 BSTreeNode *m_pLeft; // left child of node
 BSTreeNode *m_pRight; // right child of node
};
 
 
 
第16題:
題目(微軟):
輸入一顆二元樹,從上往下按層打印樹的每一個結點,同一層中按照從左往右的順序打印。 
例如輸入
 8
 / \
 6 10
/ \ / \
5 7 9 11
 
輸出8 6 10 5 7 9 11。
 
 
 
第17題:
題目:在一個字符串中找到第一個只出現一次的字符。如輸入abaccdeff,則輸出b。 
分析:這道題是2006年google的一道筆試題。
 
 
 
 
第18題:
題目:n個數字(0,1,…,n-1)造成一個圓圈,從數字0開始,
每次從這個圓圈中刪除第m個數字(第一個爲當前數字自己,第二個爲當前數字的下一個數字)。
當一個數字刪除後,從被刪除數字的下一個繼續刪除第m個數字。
求出在這個圓圈中剩下的最後一個數字。
July:我想,這個題目,很多人已經 見識過了。
 
 
 
 
第19題:
題目:定義Fibonacci數列以下: 
 / 0 n=0
f(n)= 1 n=1
 \ f(n-1)+f(n-2) n=2
 
輸入n,用最快的方法求該數列的第n項。
分析:在不少C語言教科書中講到遞歸函數的時候,都會用Fibonacci做爲例子。
所以不少程序員對這道題的遞歸解法很是熟悉,但....呵呵,你知道的。。
 
 
 
第20題:
題目:輸入一個表示整數的字符串,把該字符串轉換成整數並輸出。
例如輸入字符串"345",則輸出整數345。
 
 
 
 
第21題
2010年中興面試題
編程求解:
輸入兩個整數 n 和 m,從數列1,2,3.......n 中 隨意取幾個數,
使其和等於 m ,要求將其中全部的可能組合列出來.
 
 
 
第22題:
有4張紅色的牌和4張藍色的牌,主持人先拿任意兩張,再分別在A、B、C三人額頭上貼任意兩張牌,
A、B、C三人均可以看見其他兩人額頭上的牌,看完後讓他們猜本身額頭上是什麼顏色的牌,
A說不知道,B說不知道,C說不知道,而後A說知道了。
請教如何推理,A是怎麼知道的。
若是用程序,又怎麼實現呢?
 
 
 
 
第23題:
用最簡單,最快速的方法計算出下面這個圓形是否和正方形相交。" 
3D座標系 原點(0.0,0.0,0.0)
圓形:
半徑r = 3.0
圓心o = (*.*, 0.0, *.*)
 
正方形:
4個角座標; 
1:(*.*, 0.0, *.*)
2:(*.*, 0.0, *.*)
3:(*.*, 0.0, *.*)
4:(*.*, 0.0, *.*)
 
 
 
第24題:
鏈表操做,
(1).單鏈表就地逆置,
(2)合併鏈表
 
 
 
第25題:
寫一個函數,它的原形是int continumax(char *outputstr,char *intputstr)
功能:
在字符串中找出連續最長的數字串,並把這個串的長度返回,
並把這個最長數字串付給其中一個函數參數outputstr所指內存。
例如:"abcd12345ed125ss123456789"的首地址傳給intputstr後,函數將返回9,
outputstr所指的值爲123456789
 
 
 
26.左旋轉字符串
 
題目:
定義字符串的左旋轉操做:把字符串前面的若干個字符移動到字符串的尾部。
 
如把字符串abcdef左旋轉2位獲得字符串cdefab。請實現字符串左旋轉的函數。
要求時間對長度爲n的字符串操做的複雜度爲O(n),輔助內存爲O(1)。
 
 
 
27.跳臺階問題
題目:一個臺階總共有n級,若是一次能夠跳1級,也能夠跳2級。
求總共有多少總跳法,並分析算法的時間複雜度。
 
這道題最近常常出現,包括MicroStrategy等比較重視算法的公司
都曾前後選用過個這道題做爲面試題或者筆試題。
 
 
 
 
 
28.整數的二進制表示中1的個數
題目:輸入一個整數,求該整數的二進制表達中有多少個1。
例如輸入10,因爲其二進制表示爲1010,有兩個1,所以輸出2。
 
分析:
這是一道很基本的考查位運算的面試題。
包括微軟在內的不少公司都曾採用過這道題。
 
 
 
 
 
 
29.棧的push、pop序列
題目:輸入兩個整數序列。其中一個序列表示棧的push順序,
判斷另外一個序列有沒有多是對應的pop順序。
爲了簡單起見,咱們假設push序列的任意兩個整數都是不相等的。 
 
好比輸入的push序列是一、二、三、四、5,那麼四、五、三、二、1就有多是一個pop系列。
由於能夠有以下的push和pop序列:
push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,
這樣獲得的pop序列就是四、五、三、二、1。
但序列四、三、五、一、2就不多是push序列一、二、三、四、5的pop序列。
 
 
 
 
30.在從1到n的正數中1出現的次數
題目:輸入一個整數n,求從1到n這n個整數的十進制表示中1出現的次數。
 
例如輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。
分析:這是一道廣爲流傳的google面試題。
 
 
 
31.華爲面試題:
一相似於蜂窩的結構的圖,進行搜索最短路徑(要求5分鐘)
 
 
 
32.
有兩個序列a,b,大小都爲n,序列元素的值任意整數,無序;
要求:經過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小。
例如: 
var a=[100,99,98,1,2, 3];
var b=[1, 2, 3, 4,5,40];
 
 
 
 
33.
實現一個挺高級的字符匹配算法:
給一串很長字符串,要求找到符合要求的字符串,例如目的串:123
1******3***2 ,12*****3這些都要找出來
其實就是相似一些和諧系統。。。。。
 
 
 
 
34.
實現一個隊列。
隊列的應用場景爲:
一個生產者線程將int類型的數入列,一個消費者線程將int類型的數出列
 
 
 
 
35.
求一個矩陣中最大的二維矩陣(元素和最大).如:
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是:
4 5
5 3
要求:(1)寫出算法;(2)分析時間複雜度;(3)用C寫出關鍵代碼
 
 
 
 
第36題-40題(有些題目蒐集於CSDN上的網友,已標明):
36.引用自網友:longzuo
谷歌筆試:
n支隊伍比賽,分別編號爲0,1,2。。。。n-1,已知它們之間的實力對比關係,
存儲在一個二維數組w[n][n]中,w[i][j] 的值表明編號爲i,j的隊伍中更強的一支。
 
因此w[i][j]=i 或者j,如今給出它們的出場順序,並存儲在數組order[n]中,
好比order[n] = {4,3,5,8,1......},那麼第一輪比賽就是 4對3, 5對8。.......
勝者晉級,敗者淘汰,同一輪淘汰的全部隊伍排名再也不細分,便可以隨便排,
下一輪由上一輪的勝者按照順序,再依次兩兩比,好比多是4對5,直至出現第一名
 
編程實現,給出二維數組w,一維數組order 和 用於輸出比賽名次的數組result[n],
求出result。
 
 
 
37.
有n個長爲m+1的字符串,
若是某個字符串的最後m個字符與某個字符串的前m個字符匹配,則兩個字符串能夠聯接,
問這n個字符串最多能夠連成一個多長的字符串,若是出現循環,則返回錯誤。
 
 
 
38.
百度面試:
1.用天平(只能比較,不能稱重)從一堆小球中找出其中惟一一個較輕的,使用x次天平,
最多能夠從y個小球中找出較輕的那個,求y與x的關係式。
 
2.有一個很大很大的輸入流,大到沒有存儲器能夠將其存儲下來,
並且只輸入一次,如何從這個輸入流中隨機取得m個記錄。
 
3.大量的URL字符串,如何從中去除重複的,優化時間空間複雜度
 
 
 
 
39.
網易有道筆試:
(1).
求一個二叉樹中任意兩個節點間的最大距離,
兩個節點的距離的定義是 這兩個節點間邊的個數,
好比某個孩子節點和父節點間的距離是1,和相鄰兄弟節點間的距離是2,優化時間空間複雜度。
 
(2).
求一個有向連通圖的割點,割點的定義是,若是除去此節點和與其相關的邊,
有向圖再也不連通,描述算法。
 
40.百度研發筆試題
引用自:zp155334877
1)設計一個棧結構,知足一下條件:min,push,pop操做的時間複雜度爲O(1)。
 
2)一串首尾相連的珠子(m個),有N種顏色(N<=10),
設計一個算法,取出其中一段,要求包含全部N中顏色,並使長度最短。
並分析時間複雜度與空間複雜度。
 
3)設計一個系統處理詞語搭配問題,好比說 中國 和人民能夠搭配,
則中國人民 人民中國都有效。要求:
 
 *系統每秒的查詢數量可能上千次;
 *詞語的數量級爲10W;
 *每一個詞至多能夠與1W個詞搭配
 
當用戶輸入中國人民的時候,要求返回與這個搭配詞組相關的信息。
 
 
 
 
41.求固晶機的晶元查找程序
晶元盤由數目不詳的大小同樣的晶元組成,晶元並不必定全佈滿晶元盤,
 
照相機每次這能匹配一個晶元,如匹配過,則拾取該晶元,
若匹配不過,照相機則按測好的晶元間距移到下一個位置。
求遍歷晶元盤的算法 求思路。
 
 
 
 
42.請修改append函數,利用這個函數實現:
 
兩個非降序鏈表的並集,1->2->3 和 2->3->5 併爲 1->2->3->5
另外只能輸出結果,不能修改兩個鏈表的數據。
 
 
 
43.遞歸和非遞歸倆種方法實現二叉樹的前序遍歷。
 
 
 
44.騰訊面試題:
1.設計一個魔方(六面)的程序。
2.有一千萬條短信,有重複,以文本文件的形式保存,一行一條,有重複。
請用5分鐘時間,找出重複出現最多的前10條。
 
3.收藏了1萬條url,如今給你一條url,如何找出類似的url。(面試官不解釋何爲類似)
 
 
 
45.雅虎:
1.對於一個整數矩陣,存在一種運算,對矩陣中任意元素加一時,須要其相鄰(上下左右)
 
某一個元素也加一,現給出一正數矩陣,判斷其是否可以由一個全零矩陣通過上述運算獲得。
2.一個整數數組,長度爲n,將其分爲m份,使各份的和相等,求m的最大值
  好比{3,2,4,3,6} 能夠分紅{3,2,4,3,6} m=1;
 {3,6}{2,4,3} m=2
 {3,3}{2,4}{6} m=3 因此m的最大值爲3
 
 
 
 
46.搜狐:
四對括號能夠有多少種匹配排列方式?好比兩對括號能夠有兩種:()()和(())
 
 
 
47.創新工場:
求一個數組的最長遞減子序列 好比{9,4,3,2,5,4,3,2}的最長遞減子序列爲{9,5,4,3,2}
 
 
 
48.微軟:
一個數組是由一個遞減數列左移若干位造成的,好比{4,3,2,1,6,5}
是由{6,5,4,3,2,1}左移兩位造成的,在這種數組中查找某一個數。
 
 
 
49.一道看上去很嚇人的算法面試題:
如何對n個數進行排序,要求時間複雜度O(n),空間複雜度O(1)
 
 
 
50.網易有道筆試:
1.求一個二叉樹中任意兩個節點間的最大距離,兩個節點的距離的定義是 這兩個節點間邊的個數,
好比某個孩子節點和父節點間的距離是1,和相鄰兄弟節點間的距離是2,優化時間空間複雜度。
 
2.求一個有向連通圖的割點,割點的定義是,
若是除去此節點和與其相關的邊,有向圖再也不連通,描述算法。
-------------------------------------------------------------------
 
 
51.和爲n連續正數序列。
題目:輸入一個正數n,輸出全部和爲n連續正數序列。
 
例如輸入15,因爲1+2+3+4+5=4+5+6=7+8=15,因此輸出3個連續序列1-五、4-6和7-8。
分析:這是網易的一道面試題。
 
 
 
 
52.二元樹的深度。
 
題目:輸入一棵二元樹的根結點,求該樹的深度。
 
從根結點到葉結點依次通過的結點(含根、葉結點)造成樹的一條路徑,最長路徑的長度爲樹的深度。
 
例如:輸入二元樹:
                                            10
                                          /     \
                                        6        14
                                      /         /   \
                                    4         12     16
 
輸出該樹的深度3。
 
二元樹的結點定義以下:
 
struct SBinaryTreeNode // a node of the binary tree
{
      int               m_nValue; // value of node
      SBinaryTreeNode *m_pLeft; // left child of node
      SBinaryTreeNode *m_pRight; // right child of node
};
分析:這道題本質上仍是考查二元樹的遍歷。
 
 
 
 
 
53.字符串的排列。
題目:輸入一個字符串,打印出該字符串中字符的全部排列。
例如輸入字符串abc,則輸出由字符a、b、c所能排列出來的全部字符串
abc、acb、bac、bca、cab和cba。
 
分析:這是一道很好的考查對遞歸理解的編程題,
所以在過去一年中頻繁出如今各大公司的面試、筆試題中。
 
 
 
54.調整數組順序使奇數位於偶數前面。
 
題目:輸入一個整數數組,調整數組中數字的順序,使得全部奇數位於數組的前半部分,
 
全部偶數位於數組的後半部分。要求時間複雜度爲O(n)。
 
 
 
 
55.
 
題目:類CMyString的聲明以下:
class CMyString
{
public:
      CMyString(char* pData = NULL);
      CMyString(const CMyString& str);
      ~CMyString(void);
      CMyString& operator = (const CMyString& str);
 
private:
      char* m_pData;
};
請實現其賦值運算符的重載函數,要求異常安全,即當對一個對象進行賦值時發生異常,對象的狀態不能改變。
 
 
 
56.最長公共字串。
 
題目:若是字符串一的全部字符按其在字符串中的順序出如今另一個字符串二中,
 
則字符串一稱之爲字符串二的子串。
 
注意,並不要求子串(字符串一)的字符必須連續出如今字符串二中。
請編寫一個函數,輸入兩個字符串,求它們的最長公共子串,並打印出最長公共子串。
 
例如:輸入兩個字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它們的最長公共子串,
則輸出它們的長度4,並打印任意一個子串。
 
分析:求最長公共子串(Longest Common Subsequence, LCS)是一道很是經典的動態規劃題,
 
所以一些重視算法的公司像MicroStrategy都把它看成面試題。
 
 
 
 
57.用倆個棧實現隊列。
 
題目:某隊列的聲明以下:
 
template<typename T> class CQueue
{
public:
      CQueue() {}
      ~CQueue() {}
 
      void appendTail(const T& node); // append a element to tail
      void deleteHead();               // remove a element from head
 
private:
     T> m_stack1;
     T> m_stack2;
};
 
分析:從上面的類的聲明中,咱們發如今隊列中有兩個棧。
所以這道題實質上是要求咱們用兩個棧來實現一個隊列。
相信你們對棧和隊列的基本性質都很是瞭解了:棧是一種後入先出的數據容器,
所以對隊列進行的插入和刪除操做都是在棧頂上進行;隊列是一種先入先出的數據容器,
咱們老是把新元素插入到隊列的尾部,而從隊列的頭部刪除元素。
 
 
 
 
58.從尾到頭輸出鏈表。
 
題目:輸入一個鏈表的頭結點,從尾到頭反過來輸出每一個結點的值。鏈表結點定義以下:
struct ListNode
{
 
      int       m_nKey;
      ListNode* m_pNext;
};
分析:這是一道頗有意思的面試題。
該題以及它的變體常常出如今各大公司的面試、筆試題中。
 
 
 
 
59.不能被繼承的類。
題目:用C++設計一個不能被繼承的類。
 
分析:這是Adobe公司2007年校園招聘的最新筆試題。
這道題除了考察應聘者的C++基本功底外,還能考察反應能力,是一道很好的題目。
 
 
 
 
 
60.在O(1)時間內刪除鏈表結點。
 
題目:給定鏈表的頭指針和一個結點指針,在O(1)時間刪除該結點。鏈表結點的定義以下:
 
struct ListNode
 
{
 
      int        m_nKey;
 
      ListNode* m_pNext;
 
};
 
函數的聲明以下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);
 
分析:這是一道廣爲流傳的Google面試題,能有效考察咱們的編程基本功,還能考察咱們的反應速度,
 
更重要的是,還能考察咱們對時間複雜度的理解。
-------------------------------------------------------------------------
 
 
 
61.找出數組中兩個只出現一次的數字
題目:一個整型數組裏除了兩個數字以外,其餘的數字都出現了兩次。
請寫程序找出這兩個只出現一次的數字。要求時間複雜度是O(n),空間複雜度是O(1)。
 
分析:這是一道很新穎的關於位運算的面試題。
 
 
 
 
62.找出鏈表的第一個公共結點。
題目:兩個單向鏈表,找出它們的第一個公共結點。
 
鏈表的結點定義爲:
struct ListNode
 
{
 
      int         m_nKey;
 
      ListNode*   m_pNext;
 
};
 
分析:這是一道微軟的面試題。微軟很是喜歡與鏈表相關的題目,
所以在微軟的面試題中,鏈表出現的機率至關高。
 
 
 
 
63.在字符串中刪除特定的字符。
題目:輸入兩個字符串,從第一字符串中刪除第二個字符串中全部的字符。例如,輸入」They are students.」和」aeiou」,
 
則刪除以後的第一個字符串變成」Thy r stdnts.」。
 
分析:這是一道微軟面試題。在微軟的常見面試題中,與字符串相關的題目佔了很大的一部分,
由於寫程序操做字符串能很好的反映咱們的編程基本功。
 
 
 
 
64. 尋找醜數。
題目:咱們把只包含因子二、3和5的數稱做醜數(Ugly Number)。例如六、8都是醜數,
但14不是,由於它包含因子7。習慣上咱們把1當作是第一個醜數。
求按從小到大的順序的第1500個醜數。
 
分析:這是一道在網絡上廣爲流傳的面試題,聽說google曾經採用過這道題。
 
 
 
 
65.輸出1到最大的N位數
題目:輸入數字n,按順序輸出從1最大的n位10進制數。好比輸入3,
 
則輸出一、二、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.給出一個函數來輸出一個字符串的全部排列。
ANSWER 簡單的回溯就能夠實現了。固然排列的產生也有不少種算法,去看看組合數學,
 
還有逆序生成排列和一些不須要遞歸生成排列的方法。
印象中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),以複製一個複雜鏈表。
 
分析:在常見的數據結構上稍加變化,這是一種很新穎的面試題。
要在不到一個小時的時間裏解決這種類型的題目,咱們須要較快的反應能力,
對數據結構透徹的理解以及紮實的編程功底。
 
 
 
 
 
 
77.關於鏈表問題的面試題目以下:
 
1.給定單鏈表,檢測是否有環。
 
 使用兩個指針p1,p2從鏈表頭開始遍歷,p1每次前進一步,p2每次前進兩步。若是p2到達鏈表尾部,
 
說明無環,不然p一、p2必然會在某個時刻相遇(p1==p2),從而檢測到鏈表中有環。
 
 
 
2.給定兩個單鏈表(head1, head2),檢測兩個鏈表是否有交點,若是有返回第一個交點。
 
        若是head1==head2,那麼顯然相交,直接返回head1。
 
不然,分別從head1,head2開始遍歷兩個鏈表得到其長度len1與len2,假設len1>=len2,
那麼指針p1由head1開始向後移動len1-len2步,指針p2=head2,
下面p一、p2每次向後前進一步並比較p1p2是否相等,若是相等即返回該結點,
不然說明兩個鏈表沒有交點。
 
 
3.給定單鏈表(head),若是有環的話請返回從頭結點進入環的第一個節點。
        運用題一,咱們能夠檢查鏈表中是否有環。
        若是有環,那麼p1p2重合點p必然在環中。從p點斷開環,
方法爲:p1=p, p2=p->next, p->next=NULL。此時,原單鏈表能夠看做兩條單鏈表,
一條從head開始,另外一條從p2開始,因而運用題二的方法,咱們找到它們的第一個交點即爲所求。
 
 
4.只給定單鏈表中某個結點p(並不是最後一個結點,即p->next!=NULL)指針,刪除該結點。
 辦法很簡單,首先是放p中數據,而後將p->next的數據copy入p中,接下來刪除p->next便可。
 
5.只給定單鏈表中某個結點p(非空結點),在p前面插入一個結點。
  辦法與前者相似,首先分配一個結點q,將q插入在p後,接下來將p中的數據copy入q中,
而後再將要插入的數據記錄在p中。
 
 
 
 
78.鏈表和數組的區別在哪裏?
 
分析:主要在基本概念上的理解。
可是最好能考慮的全面一點,如今公司招人的競爭可能就在細節上產生,
誰比較仔細,誰獲勝的機會就大。
 
 
 
 
79.
1.編寫實現鏈表排序的一種算法。說明爲何你會選擇用這樣的方法?
2.編寫實現數組排序的一種算法。說明爲何你會選擇用這樣的方法?
3.請編寫能直接實現strstr()函數功能的代碼。
 
 
 
 
80.阿里巴巴一道筆試題
 
問題描述:
12個高矮不一樣的人,排成兩排,每排必須是從矮到高排列,並且第二排比對應的第一排的人高,問排列方式有多少種?
這個筆試題,很YD,由於把某個遞歸關係隱藏得很深。
相關文章
相關標籤/搜索