================
作者:July 2010年12月6日
微軟等100題系列V0.1版終于結(jié)束了。
從2010年10月11日當(dāng)天最初發(fā)表前40題以來,直至此刻,整理這100題,已有近2個(gè)月。
2個(gè)月,因?yàn)橐磉@100題,很多很多其它的事都被我強(qiáng)迫性的擱置一旁,
如今,要好好專心去做因這100題而被耽誤的、其它的事了。
這微軟等數(shù)據(jù)結(jié)構(gòu)+算法面試100題系列(是的,系列),到底現(xiàn)在、或此刻、或未來,對(duì)初學(xué)者有多大的意義,
在此,我就不給予評(píng)說了。
由他們自己來認(rèn)定。所謂,公道自在人心,我相信這句話。
任何人,對(duì)以下任何資料、題目、或答案,有任何問題,歡迎聯(lián)系我。
作者郵箱:
zhoulei0907@yahoo.cn
786165179@qq.com
作者聲明:
轉(zhuǎn)載或引用以下任何資料、或題目,請(qǐng)注明作者本人July及出處。
向您的厚道致敬,謝謝。
好了,請(qǐng)享受這完完整整的100題吧,這可是首次完整亮相哦。:D。
-----------------------------------
1.把二元查找樹轉(zhuǎn)變成排序的雙向鏈表
題目:
輸入一棵二元查找樹,將該二元查找樹轉(zhuǎn)換成一個(gè)排序的雙向鏈表。
要求不能創(chuàng)建任何新的結(jié)點(diǎn),只調(diào)整指針的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
轉(zhuǎn)換成雙向鏈表
4=6=8=10=12=14=16。
首先我們定義的二元查找樹 節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
2.設(shè)計(jì)包含min函數(shù)的棧。
定義棧的數(shù)據(jù)結(jié)構(gòu),要求添加一個(gè)min函數(shù),能夠得到棧的最小元素。
要求函數(shù)min、push以及pop的時(shí)間復(fù)雜度都是O(1)。
3.求子數(shù)組的最大和
題目:
輸入一個(gè)整形數(shù)組,數(shù)組里有正數(shù)也有負(fù)數(shù)。
數(shù)組中連續(xù)的一個(gè)或多個(gè)整數(shù)組成一個(gè)子數(shù)組,每個(gè)子數(shù)組都有一個(gè)和。
求所有子數(shù)組的和的最大值。要求時(shí)間復(fù)雜度為O(n)。
例如輸入的數(shù)組為1, -2, 3, 10, -4, 7, 2, -5,和最大的子數(shù)組為3, 10, -4, 7, 2,
因此輸出為該子數(shù)組的和18。
4.在二元樹中找出和為某一值的所有路徑
題目:輸入一個(gè)整數(shù)和一棵二元樹。
從樹的根結(jié)點(diǎn)開始往下訪問一直到葉結(jié)點(diǎn)所經(jīng)過的所有結(jié)點(diǎn)形成一條路徑。
打印出和與輸入整數(shù)相等的所有路徑。
例如 輸入整數(shù)22和如下二元樹
10
/ \
5 12
/ \
4 7
則打印出兩條路徑:10, 12和10, 5, 7。
二元樹節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)定義為:
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個(gè)元素
題目:輸入n個(gè)整數(shù),輸出其中最小的k個(gè)。
例如輸入1,2,3,4,5,6,7和8這8個(gè)數(shù)字,則最小的4個(gè)數(shù)字為1,2,3和4。
第6題
騰訊面試題:
給你10分鐘時(shí)間,根據(jù)上排給出十個(gè)數(shù),在其下排填出對(duì)應(yīng)的十個(gè)數(shù)
要求下排每個(gè)數(shù)都是先前上排那十個(gè)數(shù)在下排出現(xiàn)的次數(shù)。
上排的十個(gè)數(shù)如下:
【0,1,2,3,4,5,6,7,8,9】
舉一個(gè)例子,
數(shù)值: 0,1,2,3,4,5,6,7,8,9
分配: 6,2,1,0,0,0,1,0,0,0
0在下排出現(xiàn)了6次,1在下排出現(xiàn)了2次,
2在下排出現(xiàn)了1次,3在下排出現(xiàn)了0次....
以此類推..
第7題
微軟亞院之編程判斷倆個(gè)鏈表是否相交
給出倆個(gè)單向鏈表的頭指針,比如h1,h2,判斷這倆個(gè)鏈表是否相交。
為了簡(jiǎn)化問題,我們假設(shè)倆個(gè)鏈表均不帶環(huán)。
問題擴(kuò)展:
1.如果鏈表可能有環(huán)列?
2.如果需要求出倆個(gè)鏈表相交的第一個(gè)節(jié)點(diǎn)列?
第8題
此貼選一些 比較怪的題,,由于其中題目本身與算法關(guān)系不大,僅考考思維。特此并作一題。
1.有兩個(gè)房間,一間房里有三盞燈,另一間房有控制著三盞燈的三個(gè)開關(guān),
這兩個(gè)房間是 分割開的,從一間里不能看到另一間的情況。
現(xiàn)在要求受訓(xùn)者分別進(jìn)這兩房間一次,然后判斷出這三盞燈分別是由哪個(gè)開關(guān)控制的。
有什么辦法呢?
2.你讓一些人為你工作了七天,你要用一根金條作為報(bào)酬。金條被分成七小塊,每天給出一塊。
如果你只能將金條切割兩次,你怎樣分給這些工人?
3. ★用一種算法來顛倒一個(gè)鏈接表的順序。現(xiàn)在在不用遞歸式的情況下做一遍。
★用一種算法在一個(gè)循環(huán)的鏈接表里插入一個(gè)節(jié)點(diǎn),但不得穿越鏈接表。
★用一種算法整理一個(gè)數(shù)組。你為什么選擇這種方法?
★用一種算法使通用字符串相匹配。
★顛倒一個(gè)字符串。優(yōu)化速度。優(yōu)化空間。
★顛倒一個(gè)句子中的詞的順序,比如將“我叫克麗絲”轉(zhuǎn)換為“克麗絲叫我”,
實(shí)現(xiàn)速度最快,移動(dòng)最少。
★找到一個(gè)子字符串。優(yōu)化速度。優(yōu)化空間。
★比較兩個(gè)字符串,用O(n)時(shí)間和恒量空間。
★假設(shè)你有一個(gè)用1001個(gè)整數(shù)組成的數(shù)組,這些整數(shù)是任意排列的,但是你知道所有的整數(shù)都在1到1000(包括1000)之間。此外,除一個(gè)數(shù)字出現(xiàn)兩次外,其他所有數(shù)字只出現(xiàn)一次。假設(shè)你只能對(duì)這個(gè)數(shù)組做一次處理,用一種算法找出重復(fù)的那個(gè)數(shù)字。如果你在運(yùn)算中使用了輔助的存儲(chǔ)方式,那么你能找到不用這種方式的算法嗎?
★不用乘法或加法增加8倍。現(xiàn)在用同樣的方法增加7倍。
第9題
判斷整數(shù)序列是不是二元查找樹的后序遍歷結(jié)果
題目:輸入一個(gè)整數(shù)數(shù)組,判斷該數(shù)組是不是某二元查找樹的后序遍歷的結(jié)果。
如果是返回true,否則返回false。
例如輸入5、7、6、9、11、10、8,由于這一整數(shù)序列是如下樹的后序遍歷結(jié)果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果輸入7、4、6、5,沒有哪棵樹的后序遍歷的結(jié)果是這個(gè)序列,因此返回false。
第10題
翻轉(zhuǎn)句子中單詞的順序。
題目:輸入一個(gè)英文句子,翻轉(zhuǎn)句子中單詞的順序,但單詞內(nèi)字符的順序不變。
句子中單詞以空格符隔開。為簡(jiǎn)單起見,標(biāo)點(diǎn)符號(hào)和普通字母一樣處理。
例如輸入“I am a student.”,則輸出“student. a am I”。
第11題
求二叉樹中節(jié)點(diǎn)的最大距離...
如果我們把二叉樹看成一個(gè)圖,父子節(jié)點(diǎn)之間的連線看成是雙向的,
我們姑且定義"距離"為兩節(jié)點(diǎn)之間邊的個(gè)數(shù)。
寫一個(gè)程序,
求一棵二叉樹中相距最遠(yuǎn)的兩個(gè)節(jié)點(diǎn)之間的距離。
第12題
題目:求1+2+…+n,
要求不能使用乘除法、for、while、if、else、switch、case等關(guān)鍵字以及條件判斷語(yǔ)句(A?B:C)。
第13題:
題目:輸入一個(gè)單向鏈表,輸出該鏈表中倒數(shù)第k個(gè)結(jié)點(diǎn)。鏈表的倒數(shù)第0個(gè)結(jié)點(diǎn)為鏈表的尾指針。
鏈表結(jié)點(diǎn)定義如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
第14題:
題目:輸入一個(gè)已經(jīng)按升序排序過的數(shù)組和一個(gè)數(shù)字,
在數(shù)組中查找兩個(gè)數(shù),使得它們的和正好是輸入的那個(gè)數(shù)字。
要求時(shí)間復(fù)雜度是O(n)。如果有多對(duì)數(shù)字的和等于輸入的數(shù)字,輸出任意一對(duì)即可。
例如輸入數(shù)組1、2、4、7、11、15和數(shù)字15。由于4+11=15,因此輸出4和11。
第15題:
題目:輸入一顆二元查找樹,將該樹轉(zhuǎn)換為它的鏡像,
即在轉(zhuǎn)換后的二元查找樹中,左子樹的結(jié)點(diǎn)都大于右子樹的結(jié)點(diǎn)。
用遞歸和循環(huán)兩種方法完成樹的鏡像轉(zhuǎn)換。
例如輸入:
8
/ \
6 10
/\ /\
5 7 9 11
輸出:
8
/ \
10 6
/\ /\
11 9 7 5
定義二元查找樹的結(jié)點(diǎn)為:
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題:
題目(微軟):
輸入一顆二元樹,從上往下按層打印樹的每個(gè)結(jié)點(diǎn),同一層中按照從左往右的順序打印。
例如輸入
8
/ \
6 10
/ \ / \
5 7 9 11
輸出8 6 10 5 7 9 11。
第17題:
題目:在一個(gè)字符串中找到第一個(gè)只出現(xiàn)一次的字符。如輸入abaccdeff,則輸出b。
分析:這道題是2006年google的一道筆試題。
第18題:
題目:n個(gè)數(shù)字(0,1,…,n-1)形成一個(gè)圓圈,從數(shù)字0開始,
每次從這個(gè)圓圈中刪除第m個(gè)數(shù)字(第一個(gè)為當(dāng)前數(shù)字本身,第二個(gè)為當(dāng)前數(shù)字的下一個(gè)數(shù)字)。
當(dāng)一個(gè)數(shù)字刪除后,從被刪除數(shù)字的下一個(gè)繼續(xù)刪除第m個(gè)數(shù)字。
求出在這個(gè)圓圈中剩下的最后一個(gè)數(shù)字。
July:我想,這個(gè)題目,不少人已經(jīng) 見識(shí)過了。
第19題:
題目:定義Fibonacci數(shù)列如下:
/ 0 n=0
f(n)= 1 n=1
\ f(n-1)+f(n-2) n=2
輸入n,用最快的方法求該數(shù)列的第n項(xiàng)。
分析:在很多C語(yǔ)言教科書中講到遞歸函數(shù)的時(shí)候,都會(huì)用Fibonacci作為例子。
因此很多程序員對(duì)這道題的遞歸解法非常熟悉,但....呵呵,你知道的。。
第20題:
題目:輸入一個(gè)表示整數(shù)的字符串,把該字符串轉(zhuǎn)換成整數(shù)并輸出。
例如輸入字符串"345",則輸出整數(shù)345。
第21題
2010年中興面試題
編程求解:
輸入兩個(gè)整數(shù) n 和 m,從數(shù)列1,2,3.......n 中 隨意取幾個(gè)數(shù),
使其和等于 m ,要求將其中所有的可能組合列出來.
第22題:
有4張紅色的牌和4張藍(lán)色的牌,主持人先拿任意兩張,再分別在A、B、C三人額頭上貼任意兩張牌,
A、B、C三人都可以看見其余兩人額頭上的牌,看完后讓他們猜自己額頭上是什么顏色的牌,
A說不知道,B說不知道,C說不知道,然后A說知道了。
請(qǐng)教如何推理,A是怎么知道的。
如果用程序,又怎么實(shí)現(xiàn)呢?
第23題:
用最簡(jiǎn)單,最快速的方法計(jì)算出下面這個(gè)圓形是否和正方形相交。"
3D坐標(biāo)系 原點(diǎn)(0.0,0.0,0.0)
圓形:
半徑r = 3.0
圓心o = (*.*, 0.0, *.*)
正方形:
4個(gè)角坐標(biāo);
1:(*.*, 0.0, *.*)
2:(*.*, 0.0, *.*)
3:(*.*, 0.0, *.*)
4:(*.*, 0.0, *.*)
第24題:
鏈表操作,
(1).單鏈表就地逆置,
(2)合并鏈表
第25題:
寫一個(gè)函數(shù),它的原形是int continumax(char *outputstr,char *intputstr)
功能:
在字符串中找出連續(xù)最長(zhǎng)的數(shù)字串,并把這個(gè)串的長(zhǎng)度返回,
并把這個(gè)最長(zhǎng)數(shù)字串付給其中一個(gè)函數(shù)參數(shù)outputstr所指內(nèi)存。
例如:"abcd12345ed125ss123456789"的首地址傳給intputstr后,函數(shù)將返回9,
outputstr所指的值為123456789
26.左旋轉(zhuǎn)字符串
題目:
定義字符串的左旋轉(zhuǎn)操作:把字符串前面的若干個(gè)字符移動(dòng)到字符串的尾部。
如把字符串a(chǎn)bcdef左旋轉(zhuǎn)2位得到字符串cdefab。請(qǐng)實(shí)現(xiàn)字符串左旋轉(zhuǎn)的函數(shù)。
要求時(shí)間對(duì)長(zhǎng)度為n的字符串操作的復(fù)雜度為O(n),輔助內(nèi)存為O(1)。
27.跳臺(tái)階問題
題目:一個(gè)臺(tái)階總共有n級(jí),如果一次可以跳1級(jí),也可以跳2級(jí)。
求總共有多少總跳法,并分析算法的時(shí)間復(fù)雜度。
這道題最近經(jīng)常出現(xiàn),包括MicroStrategy等比較重視算法的公司
都曾先后選用過個(gè)這道題作為面試題或者筆試題。
28.整數(shù)的二進(jìn)制表示中1的個(gè)數(shù)
題目:輸入一個(gè)整數(shù),求該整數(shù)的二進(jìn)制表達(dá)中有多少個(gè)1。
例如輸入10,由于其二進(jìn)制表示為1010,有兩個(gè)1,因此輸出2。
分析:
這是一道很基本的考查位運(yùn)算的面試題。
包括微軟在內(nèi)的很多公司都曾采用過這道題。
29.棧的push、pop序列
題目:輸入兩個(gè)整數(shù)序列。其中一個(gè)序列表示棧的push順序,
判斷另一個(gè)序列有沒有可能是對(duì)應(yīng)的pop順序。
為了簡(jiǎn)單起見,我們假設(shè)push序列的任意兩個(gè)整數(shù)都是不相等的。
比如輸入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一個(gè)pop系列。
因?yàn)榭梢杂腥缦碌膒ush和pop序列:
push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,
這樣得到的pop序列就是4、5、3、2、1。
但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。
30.在從1到n的正數(shù)中1出現(xiàn)的次數(shù)
題目:輸入一個(gè)整數(shù)n,求從1到n這n個(gè)整數(shù)的十進(jìn)制表示中1出現(xiàn)的次數(shù)。
例如輸入12,從1到12這些整數(shù)中包含1 的數(shù)字有1,10,11和12,1一共出現(xiàn)了5次。
分析:這是一道廣為流傳的google面試題。
31.華為面試題:
一類似于蜂窩的結(jié)構(gòu)的圖,進(jìn)行搜索最短路徑(要求5分鐘)
32.
有兩個(gè)序列a,b,大小都為n,序列元素的值任意整數(shù),無(wú)序;
要求:通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小。
例如:
var a=[100,99,98,1,2, 3];
var b=[1, 2, 3, 4,5,40];
33.
實(shí)現(xiàn)一個(gè)挺高級(jí)的字符匹配算法:
給一串很長(zhǎng)字符串,要求找到符合要求的字符串,例如目的串:123
1******3***2 ,12*****3這些都要找出來
其實(shí)就是類似一些和諧系統(tǒng)。。。。。
34.
實(shí)現(xiàn)一個(gè)隊(duì)列。
隊(duì)列的應(yīng)用場(chǎng)景為:
一個(gè)生產(chǎn)者線程將int類型的數(shù)入列,一個(gè)消費(fèi)者線程將int類型的數(shù)出列
35.
求一個(gè)矩陣中最大的二維矩陣(元素和最大).如:
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是:
4 5
5 3
要求:(1)寫出算法;(2)分析時(shí)間復(fù)雜度;(3)用C寫出關(guān)鍵代碼
第36題-40題(有些題目搜集于CSDN上的網(wǎng)友,已標(biāo)明):
36.引用自網(wǎng)友:longzuo
谷歌筆試:
n支隊(duì)伍比賽,分別編號(hào)為0,1,2。。。。n-1,已知它們之間的實(shí)力對(duì)比關(guān)系,
存儲(chǔ)在一個(gè)二維數(shù)組w[n][n]中,w[i][j] 的值代表編號(hào)為i,j的隊(duì)伍中更強(qiáng)的一支。
所以w[i][j]=i 或者j,現(xiàn)在給出它們的出場(chǎng)順序,并存儲(chǔ)在數(shù)組order[n]中,
比如order[n] = {4,3,5,8,1......},那么第一輪比賽就是 4對(duì)3, 5對(duì)8。.......
勝者晉級(jí),敗者淘汰,同一輪淘汰的所有隊(duì)伍排名不再細(xì)分,即可以隨便排,
下一輪由上一輪的勝者按照順序,再依次兩兩比,比如可能是4對(duì)5,直至出現(xiàn)第一名
編程實(shí)現(xiàn),給出二維數(shù)組w,一維數(shù)組order 和 用于輸出比賽名次的數(shù)組result[n],
求出result。
37.
有n個(gè)長(zhǎng)為m+1的字符串,
如果某個(gè)字符串的最后m個(gè)字符與某個(gè)字符串的前m個(gè)字符匹配,則兩個(gè)字符串可以聯(lián)接,
問這n個(gè)字符串最多可以連成一個(gè)多長(zhǎng)的字符串,如果出現(xiàn)循環(huán),則返回錯(cuò)誤。
38.
百度面試:
1.用天平(只能比較,不能稱重)從一堆小球中找出其中唯一一個(gè)較輕的,使用x次天平,
最多可以從y個(gè)小球中找出較輕的那個(gè),求y與x的關(guān)系式。
2.有一個(gè)很大很大的輸入流,大到?jīng)]有存儲(chǔ)器可以將其存儲(chǔ)下來,
而且只輸入一次,如何從這個(gè)輸入流中隨機(jī)取得m個(gè)記錄。
3.大量的URL字符串,如何從中去除重復(fù)的,優(yōu)化時(shí)間空間復(fù)雜度
39.
網(wǎng)易有道筆試:
(1).
求一個(gè)二叉樹中任意兩個(gè)節(jié)點(diǎn)間的最大距離,
兩個(gè)節(jié)點(diǎn)的距離的定義是 這兩個(gè)節(jié)點(diǎn)間邊的個(gè)數(shù),
比如某個(gè)孩子節(jié)點(diǎn)和父節(jié)點(diǎn)間的距離是1,和相鄰兄弟節(jié)點(diǎn)間的距離是2,優(yōu)化時(shí)間空間復(fù)雜度。
(2).
求一個(gè)有向連通圖的割點(diǎn),割點(diǎn)的定義是,如果除去此節(jié)點(diǎn)和與其相關(guān)的邊,
有向圖不再連通,描述算法。
40.百度研發(fā)筆試題
引用自:zp155334877
1)設(shè)計(jì)一個(gè)棧結(jié)構(gòu),滿足一下條件:min,push,pop操作的時(shí)間復(fù)雜度為O(1)。
2)一串首尾相連的珠子(m個(gè)),有N種顏色(N<=10),
設(shè)計(jì)一個(gè)算法,取出其中一段,要求包含所有N中顏色,并使長(zhǎng)度最短。
并分析時(shí)間復(fù)雜度與空間復(fù)雜度。
3)設(shè)計(jì)一個(gè)系統(tǒng)處理詞語(yǔ)搭配問題,比如說 中國(guó) 和人民可以搭配,
則中國(guó)人民 人民中國(guó)都有效。要求:
*系統(tǒng)每秒的查詢數(shù)量可能上千次;
*詞語(yǔ)的數(shù)量級(jí)為10W;
*每個(gè)詞至多可以與1W個(gè)詞搭配
當(dāng)用戶輸入中國(guó)人民的時(shí)候,要求返回與這個(gè)搭配詞組相關(guān)的信息。
41.求固晶機(jī)的晶元查找程序
晶元盤由數(shù)目不詳?shù)拇笮∫粯拥木гM成,晶元并不一定全布滿晶元盤,
照相機(jī)每次這能匹配一個(gè)晶元,如匹配過,則拾取該晶元,
若匹配不過,照相機(jī)則按測(cè)好的晶元間距移到下一個(gè)位置。
求遍歷晶元盤的算法 求思路。
42.請(qǐng)修改append函數(shù),利用這個(gè)函數(shù)實(shí)現(xiàn):
兩個(gè)非降序鏈表的并集,1->2->3 和 2->3->5 并為 1->2->3->5
另外只能輸出結(jié)果,不能修改兩個(gè)鏈表的數(shù)據(jù)。
43.遞歸和非遞歸倆種方法實(shí)現(xiàn)二叉樹的前序遍歷。
44.騰訊面試題:
1.設(shè)計(jì)一個(gè)魔方(六面)的程序。
2.有一千萬(wàn)條短信,有重復(fù),以文本文件的形式保存,一行一條,有重復(fù)。
請(qǐng)用5分鐘時(shí)間,找出重復(fù)出現(xiàn)最多的前10條。
3.收藏了1萬(wàn)條url,現(xiàn)在給你一條url,如何找出相似的url。(面試官不解釋何為相似)
45.雅虎:
1.對(duì)于一個(gè)整數(shù)矩陣,存在一種運(yùn)算,對(duì)矩陣中任意元素加一時(shí),需要其相鄰(上下左右)
某一個(gè)元素也加一,現(xiàn)給出一正數(shù)矩陣,判斷其是否能夠由一個(gè)全零矩陣經(jīng)過上述運(yùn)算得到。
2.一個(gè)整數(shù)數(shù)組,長(zhǎng)度為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.搜狐:
四對(duì)括號(hào)可以有多少種匹配排列方式?比如兩對(duì)括號(hào)可以有兩種:()()和(())
47.創(chuàng)新工場(chǎng):
求一個(gè)數(shù)組的最長(zhǎng)遞減子序列 比如{9,4,3,2,5,4,3,2}的最長(zhǎng)遞減子序列為{9,5,4,3,2}
48.微軟:
一個(gè)數(shù)組是由一個(gè)遞減數(shù)列左移若干位形成的,比如{4,3,2,1,6,5}
是由{6,5,4,3,2,1}左移兩位形成的,在這種數(shù)組中查找某一個(gè)數(shù)。
49.一道看上去很嚇人的算法面試題:
如何對(duì)n個(gè)數(shù)進(jìn)行排序,要求時(shí)間復(fù)雜度O(n),空間復(fù)雜度O(1)
50.網(wǎng)易有道筆試:
1.求一個(gè)二叉樹中任意兩個(gè)節(jié)點(diǎn)間的最大距離,兩個(gè)節(jié)點(diǎn)的距離的定義是 這兩個(gè)節(jié)點(diǎn)間邊的個(gè)數(shù),
比如某個(gè)孩子節(jié)點(diǎn)和父節(jié)點(diǎn)間的距離是1,和相鄰兄弟節(jié)點(diǎn)間的距離是2,優(yōu)化時(shí)間空間復(fù)雜度。
2.求一個(gè)有向連通圖的割點(diǎn),割點(diǎn)的定義是,
如果除去此節(jié)點(diǎn)和與其相關(guān)的邊,有向圖不再連通,描述算法。
-------------------------------------------------------------------
51.和為n連續(xù)正數(shù)序列。
題目:輸入一個(gè)正數(shù)n,輸出所有和為n連續(xù)正數(shù)序列。
例如輸入15,由于1+2+3+4+5=4+5+6=7+8=15,所以輸出3個(gè)連續(xù)序列1-5、4-6和7-8。
分析:這是網(wǎng)易的一道面試題。
52.二元樹的深度。
題目:輸入一棵二元樹的根結(jié)點(diǎn),求該樹的深度。
從根結(jié)點(diǎn)到葉結(jié)點(diǎn)依次經(jīng)過的結(jié)點(diǎn)(含根、葉結(jié)點(diǎn))形成樹的一條路徑,最長(zhǎng)路徑的長(zhǎng)度為樹的深度。
例如:輸入二元樹:
10
/ \
6 14
/ / \
4 12 16
輸出該樹的深度3。
二元樹的結(jié)點(diǎn)定義如下:
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
};
分析:這道題本質(zhì)上還是考查二元樹的遍歷。
53.字符串的排列。
題目:輸入一個(gè)字符串,打印出該字符串中字符的所有排列。
例如輸入字符串a(chǎn)bc,則輸出由字符a、b、c所能排列出來的所有字符串
abc、acb、bac、bca、cab和cba。
分析:這是一道很好的考查對(duì)遞歸理解的編程題,
因此在過去一年中頻繁出現(xiàn)在各大公司的面試、筆試題中。
54.調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)前面。
題目:輸入一個(gè)整數(shù)數(shù)組,調(diào)整數(shù)組中數(shù)字的順序,使得所有奇數(shù)位于數(shù)組的前半部分,
所有偶數(shù)位于數(shù)組的后半部分。要求時(shí)間復(fù)雜度為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;
};
請(qǐng)實(shí)現(xiàn)其賦值運(yùn)算符的重載函數(shù),要求異常安全,即當(dāng)對(duì)一個(gè)對(duì)象進(jìn)行賦值時(shí)發(fā)生異常,對(duì)象的狀態(tài)不能改變。
56.最長(zhǎng)公共字串。
題目:如果字符串一的所有字符按其在字符串中的順序出現(xiàn)在另外一個(gè)字符串二中,
則字符串一稱之為字符串二的子串。
注意,并不要求子串(字符串一)的字符必須連續(xù)出現(xiàn)在字符串二中。
請(qǐng)編寫一個(gè)函數(shù),輸入兩個(gè)字符串,求它們的最長(zhǎng)公共子串,并打印出最長(zhǎng)公共子串。
例如:輸入兩個(gè)字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它們的最長(zhǎng)公共子串,
則輸出它們的長(zhǎng)度4,并打印任意一個(gè)子串。
分析:求最長(zhǎng)公共子串(Longest Common Subsequence, LCS)是一道非常經(jīng)典的動(dòng)態(tài)規(guī)劃題,
因此一些重視算法的公司像MicroStrategy都把它當(dāng)作面試題。
57.用倆個(gè)棧實(shí)現(xiàn)隊(duì)列。
題目:某隊(duì)列的聲明如下:
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;
};
分析:從上面的類的聲明中,我們發(fā)現(xiàn)在隊(duì)列中有兩個(gè)棧。
因此這道題實(shí)質(zhì)上是要求我們用兩個(gè)棧來實(shí)現(xiàn)一個(gè)隊(duì)列。
相信大家對(duì)棧和隊(duì)列的基本性質(zhì)都非常了解了:棧是一種后入先出的數(shù)據(jù)容器,
因此對(duì)隊(duì)列進(jìn)行的插入和刪除操作都是在棧頂上進(jìn)行;隊(duì)列是一種先入先出的數(shù)據(jù)容器,
我們總是把新元素插入到隊(duì)列的尾部,而從隊(duì)列的頭部刪除元素。
58.從尾到頭輸出鏈表。
題目:輸入一個(gè)鏈表的頭結(jié)點(diǎn),從尾到頭反過來輸出每個(gè)結(jié)點(diǎn)的值。鏈表結(jié)點(diǎn)定義如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
分析:這是一道很有意思的面試題。
該題以及它的變體經(jīng)常出現(xiàn)在各大公司的面試、筆試題中。
59.不能被繼承的類。
題目:用C++設(shè)計(jì)一個(gè)不能被繼承的類。
分析:這是Adobe公司2007年校園招聘的最新筆試題。
這道題除了考察應(yīng)聘者的C++基本功底外,還能考察反應(yīng)能力,是一道很好的題目。
60.在O(1)時(shí)間內(nèi)刪除鏈表結(jié)點(diǎn)。
題目:給定鏈表的頭指針和一個(gè)結(jié)點(diǎn)指針,在O(1)時(shí)間刪除該結(jié)點(diǎn)。鏈表結(jié)點(diǎn)的定義如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
函數(shù)的聲明如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);
分析:這是一道廣為流傳的Google面試題,能有效考察我們的編程基本功,還能考察我們的反應(yīng)速度,
更重要的是,還能考察我們對(duì)時(shí)間復(fù)雜度的理解。
-------------------------------------------------------------------------
61.找出數(shù)組中兩個(gè)只出現(xiàn)一次的數(shù)字
題目:一個(gè)整型數(shù)組里除了兩個(gè)數(shù)字之外,其他的數(shù)字都出現(xiàn)了兩次。
請(qǐng)寫程序找出這兩個(gè)只出現(xiàn)一次的數(shù)字。要求時(shí)間復(fù)雜度是O(n),空間復(fù)雜度是O(1)。
分析:這是一道很新穎的關(guān)于位運(yùn)算的面試題。
62.找出鏈表的第一個(gè)公共結(jié)點(diǎn)。
題目:兩個(gè)單向鏈表,找出它們的第一個(gè)公共結(jié)點(diǎn)。
鏈表的結(jié)點(diǎn)定義為:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
分析:這是一道微軟的面試題。微軟非常喜歡與鏈表相關(guān)的題目,
因此在微軟的面試題中,鏈表出現(xiàn)的概率相當(dāng)高。
63.在字符串中刪除特定的字符。
題目:輸入兩個(gè)字符串,從第一字符串中刪除第二個(gè)字符串中所有的字符。
例如,輸入”They are students.”和”aeiou”,
則刪除之后的第一個(gè)字符串變成”Thy r stdnts.”。
分析:這是一道微軟面試題。在微軟的常見面試題中,與字符串相關(guān)的題目占了很大的一部分,
因?yàn)閷懗绦虿僮髯址芎芎玫姆从澄覀兊木幊袒竟Α?/p>
64. 尋找丑數(shù)。
題目:我們把只包含因子2、3和5的數(shù)稱作丑數(shù)(Ugly Number)。例如6、8都是丑數(shù),
但14不是,因?yàn)樗蜃?。習(xí)慣上我們把1當(dāng)做是第一個(gè)丑數(shù)。
求按從小到大的順序的第1500個(gè)丑數(shù)。
分析:這是一道在網(wǎng)絡(luò)上廣為流傳的面試題,據(jù)說google曾經(jīng)采用過這道題。
65.輸出1到最大的N位數(shù)
題目:輸入數(shù)字n,按順序輸出從1最大的n位10進(jìn)制數(shù)。比如輸入3,
則輸出1、2、3一直到最大的3位數(shù)即999。
分析:這是一道很有意思的題目。看起來很簡(jiǎn)單,其實(shí)里面卻有不少的玄機(jī)。
66.顛倒棧。
題目:用遞歸顛倒一個(gè)棧。例如輸入棧{1, 2, 3, 4, 5},1在棧頂。
顛倒之后的棧為{5, 4, 3, 2, 1},5處在棧頂。
67.倆個(gè)閑玩娛樂。
1.撲克牌的順子
從撲克牌中隨機(jī)抽5張牌,判斷是不是一個(gè)順子,即這5張牌是不是連續(xù)的。
2-10為數(shù)字本身,A為1,J為11,Q為12,K為13,而大小王可以看成任意數(shù)字。
2.n個(gè)骰子的點(diǎn)數(shù)。
把n個(gè)骰子扔在地上,所有骰子朝上一面的點(diǎn)數(shù)之和為S。輸入n,
打印出S的所有可能的值出現(xiàn)的概率。
68.把數(shù)組排成最小的數(shù)。
題目:輸入一個(gè)正整數(shù)數(shù)組,將它們連接起來排成一個(gè)數(shù),輸出能排出的所有數(shù)字中最小的一個(gè)。
例如輸入數(shù)組{32, 321},則輸出這兩個(gè)能排成的最小數(shù)字32132。
請(qǐng)給出解決問題的算法,并證明該算法。
分析:這是09年6月份百度的一道面試題,
從這道題我們可以看出百度對(duì)應(yīng)聘者在算法方面有很高的要求。
69.旋轉(zhuǎn)數(shù)組中的最小元素。
題目:把一個(gè)數(shù)組最開始的若干個(gè)元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)。輸入一個(gè)排好序的數(shù)組的一個(gè)旋轉(zhuǎn),
輸出旋轉(zhuǎn)數(shù)組的最小元素。例如數(shù)組{3, 4, 5, 1, 2}為{1, 2, 3, 4, 5}的一個(gè)旋轉(zhuǎn),該數(shù)組的最小值為1。
分析:這道題最直觀的解法并不難。從頭到尾遍歷數(shù)組一次,就能找出最小的元素,
時(shí)間復(fù)雜度顯然是O(N)。但這個(gè)思路沒有利用輸入數(shù)組的特性,我們應(yīng)該能找到更好的解法。
70.給出一個(gè)函數(shù)來輸出一個(gè)字符串的所有排列。
ANSWER 簡(jiǎn)單的回溯就可以實(shí)現(xiàn)了。當(dāng)然排列的產(chǎn)生也有很多種算法,去看看組合數(shù)學(xué),
還有逆序生成排列和一些不需要遞歸生成排列的方法。
印象中Knuth的<TAOCP>第一卷里面深入講了排列的生成。這些算法的理解需要一定的數(shù)學(xué)功底,
也需要一定的靈感,有興趣最好看看。
71.數(shù)值的整數(shù)次方。
題目:實(shí)現(xiàn)函數(shù)double Power(double base, int exponent),求base的exponent次方。
不需要考慮溢出。
分析:這是一道看起來很簡(jiǎn)單的問題。可能有不少的人在看到題目后30秒寫出如下的代碼:
double Power(double base, int exponent)
{
double result = 1.0;
for(int i = 1; i <= exponent; ++i)
result *= base;
return result;
}
72.
題目:設(shè)計(jì)一個(gè)類,我們只能生成該類的一個(gè)實(shí)例。
分析:只能生成一個(gè)實(shí)例的類是實(shí)現(xiàn)了Singleton模式的類型。
73.對(duì)策字符串的最大長(zhǎng)度。
題目:輸入一個(gè)字符串,輸出該字符串中對(duì)稱的子字符串的最大長(zhǎng)度。
比如輸入字符串“google”,由于該字符串里最長(zhǎng)的對(duì)稱子字符串是“goog”,因此輸出4。
分析:可能很多人都寫過判斷一個(gè)字符串是不是對(duì)稱的函數(shù),這個(gè)題目可以看成是該函數(shù)的加強(qiáng)版。
74.數(shù)組中超過出現(xiàn)次數(shù)超過一半的數(shù)字
題目:數(shù)組中有一個(gè)數(shù)字出現(xiàn)的次數(shù)超過了數(shù)組長(zhǎng)度的一半,找出這個(gè)數(shù)字。
分析:這是一道廣為流傳的面試題,包括百度、微軟和Google在內(nèi)的多家公司都
曾經(jīng)采用過這個(gè)題目。要幾十分鐘的時(shí)間里很好地解答這道題,
除了較好的編程能力之外,還需要較快的反應(yīng)和較強(qiáng)的邏輯思維能力。
75.二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)
題目:二叉樹的結(jié)點(diǎn)定義如下:
struct TreeNode
{
int m_nvalue;
TreeNode* m_pLeft;
TreeNode* m_pRight;
};
輸入二叉樹中的兩個(gè)結(jié)點(diǎn),輸出這兩個(gè)結(jié)點(diǎn)在數(shù)中最低的共同父結(jié)點(diǎn)。
分析:求數(shù)中兩個(gè)結(jié)點(diǎn)的最低共同結(jié)點(diǎn)是面試中經(jīng)常出現(xiàn)的一個(gè)問題。這個(gè)問題至少有兩個(gè)變種。
76.復(fù)雜鏈表的復(fù)制
題目:有一個(gè)復(fù)雜鏈表,其結(jié)點(diǎn)除了有一個(gè)m_pNext指針指向下一個(gè)結(jié)點(diǎn)外,
還有一個(gè)m_pSibling指向鏈表中的任一結(jié)點(diǎn)或者NULL。其結(jié)點(diǎn)的C++定義如下:
struct ComplexNode
{
int m_nValue;
ComplexNode* m_pNext;
ComplexNode* m_pSibling;
};
下圖是一個(gè)含有5個(gè)結(jié)點(diǎn)的該類型復(fù)雜鏈表。
圖中實(shí)線箭頭表示m_pNext指針,虛線箭頭表示m_pSibling指針。為簡(jiǎn)單起見,
指向NULL的指針沒有畫出。
請(qǐng)完成函數(shù)ComplexNode* Clone(ComplexNode* pHead),以復(fù)制一個(gè)復(fù)雜鏈表。
分析:在常見的數(shù)據(jù)結(jié)構(gòu)上稍加變化,這是一種很新穎的面試題。
要在不到一個(gè)小時(shí)的時(shí)間里解決這種類型的題目,我們需要較快的反應(yīng)能力,
對(duì)數(shù)據(jù)結(jié)構(gòu)透徹的理解以及扎實(shí)的編程功底。
77.關(guān)于鏈表問題的面試題目如下:
1.給定單鏈表,檢測(cè)是否有環(huán)。
使用兩個(gè)指針p1,p2從鏈表頭開始遍歷,p1每次前進(jìn)一步,p2每次前進(jìn)兩步。如果p2到達(dá)鏈表尾部,
說明無(wú)環(huán),否則p1、p2必然會(huì)在某個(gè)時(shí)刻相遇(p1==p2),從而檢測(cè)到鏈表中有環(huán)。
2.給定兩個(gè)單鏈表(head1, head2),檢測(cè)兩個(gè)鏈表是否有交點(diǎn),如果有返回第一個(gè)交點(diǎn)。
如果head1==head2,那么顯然相交,直接返回head1。
否則,分別從head1,head2開始遍歷兩個(gè)鏈表獲得其長(zhǎng)度len1與len2,假設(shè)len1>=len2,
那么指針p1由head1開始向后移動(dòng)len1-len2步,指針p2=head2,
下面p1、p2每次向后前進(jìn)一步并比較p1p2是否相等,如果相等即返回該結(jié)點(diǎn),
否則說明兩個(gè)鏈表沒有交點(diǎn)。
3.給定單鏈表(head),如果有環(huán)的話請(qǐng)返回從頭結(jié)點(diǎn)進(jìn)入環(huán)的第一個(gè)節(jié)點(diǎn)。
運(yùn)用題一,我們可以檢查鏈表中是否有環(huán)。
如果有環(huán),那么p1p2重合點(diǎn)p必然在環(huán)中。從p點(diǎn)斷開環(huán),
方法為:p1=p, p2=p->next, p->next=NULL。此時(shí),原單鏈表可以看作兩條單鏈表,
一條從head開始,另一條從p2開始,于是運(yùn)用題二的方法,我們找到它們的第一個(gè)交點(diǎn)即為所求。
4.只給定單鏈表中某個(gè)結(jié)點(diǎn)p(并非最后一個(gè)結(jié)點(diǎn),即p->next!=NULL)指針,刪除該結(jié)點(diǎn)。
辦法很簡(jiǎn)單,首先是放p中數(shù)據(jù),然后將p->next的數(shù)據(jù)copy入p中,接下來刪除p->next即可。
5.只給定單鏈表中某個(gè)結(jié)點(diǎn)p(非空結(jié)點(diǎn)),在p前面插入一個(gè)結(jié)點(diǎn)。
辦法與前者類似,首先分配一個(gè)結(jié)點(diǎn)q,將q插入在p后,接下來將p中的數(shù)據(jù)copy入q中,
然后再將要插入的數(shù)據(jù)記錄在p中。
78.鏈表和數(shù)組的區(qū)別在哪里?
分析:主要在基本概念上的理解。
但是最好能考慮的全面一點(diǎn),現(xiàn)在公司招人的競(jìng)爭(zhēng)可能就在細(xì)節(jié)上產(chǎn)生,
誰(shuí)比較仔細(xì),誰(shuí)獲勝的機(jī)會(huì)就大。
79.
1.編寫實(shí)現(xiàn)鏈表排序的一種算法。說明為什么你會(huì)選擇用這樣的方法?
2.編寫實(shí)現(xiàn)數(shù)組排序的一種算法。說明為什么你會(huì)選擇用這樣的方法?
3.請(qǐng)編寫能直接實(shí)現(xiàn)strstr()函數(shù)功能的代碼。
80.阿里巴巴一道筆試題
問題描述:
12個(gè)高矮不同的人,排成兩排,每排必須是從矮到高排列,而且第二排比對(duì)應(yīng)的第一排的人高,問排列方式有多少種?
這個(gè)筆試題,很YD,因?yàn)榘涯硞€(gè)遞歸關(guān)系隱藏得很深。
先來幾組百度的面試題:
===================
81.第1組百度面試題
1.一個(gè)int數(shù)組,里面數(shù)據(jù)無(wú)任何限制,要求求出所有這樣的數(shù)a[i],
其左邊的數(shù)都小于等于它,右邊的數(shù)都大于等于它。
能否只用一個(gè)額外數(shù)組和少量其它空間實(shí)現(xiàn)。
2.一個(gè)文件,內(nèi)含一千萬(wàn)行字符串,每個(gè)字符串在1K以內(nèi),
要求找出所有相反的串對(duì),如abc和cba。
3.STL的set用什么實(shí)現(xiàn)的?為什么不用hash?
82.第2組百度面試題
1.給出兩個(gè)集合A和B,其中集合A={name},
集合B={age、sex、scholarship、address、...},
要求:
問題1、根據(jù)集合A中的name查詢出集合B中對(duì)應(yīng)的屬性信息;
問題2、根據(jù)集合B中的屬性信息(單個(gè)屬性,如age<20等),查詢出集合A中對(duì)應(yīng)的name。
2.給出一個(gè)文件,里面包含兩個(gè)字段{url、size},
即url為網(wǎng)址,size為對(duì)應(yīng)網(wǎng)址訪問的次數(shù),
要求:
問題1、利用Linux Shell命令或自己設(shè)計(jì)算法,
查詢出url字符串中包含“baidu”子字符串對(duì)應(yīng)的size字段值;
問題2、根據(jù)問題1的查詢結(jié)果,對(duì)其按照size由大到小的排列。
(說明:url數(shù)據(jù)量很大,100億級(jí)以上)
83.第3組百度面試題
1.今年百度的一道題目
百度筆試:給定一個(gè)存放整數(shù)的數(shù)組,重新排列數(shù)組使得數(shù)組左邊為奇數(shù),右邊為偶數(shù)。
要求:空間復(fù)雜度O(1),時(shí)間復(fù)雜度為O(n)。
2.百度筆試題
用C語(yǔ)言實(shí)現(xiàn)函數(shù)void * memmove(void *dest, const void *src, size_t n)。
memmove函數(shù)的功能是拷貝src所指的內(nèi)存內(nèi)容前n個(gè)字節(jié)到dest所指的地址上。
分析:
由于可以把任何類型的指針賦給void類型的指針
這個(gè)函數(shù)主要是實(shí)現(xiàn)各種數(shù)據(jù)類型的拷貝。
84.第4組百度面試題
2010年3道百度面試題[相信,你懂其中的含金量]
1.a~z包括大小寫與0~9組成的N個(gè)數(shù)
用最快的方式把其中重復(fù)的元素挑出來。
2.已知一隨機(jī)發(fā)生器,產(chǎn)生0的概率是p,產(chǎn)生1的概率是1-p,現(xiàn)在要你構(gòu)造一個(gè)發(fā)生器,
使得它構(gòu)造0和1的概率均為1/2;構(gòu)造一個(gè)發(fā)生器,使得它構(gòu)造1、2、3的概率均為1/3;...,
構(gòu)造一個(gè)發(fā)生器,使得它構(gòu)造1、2、3、...n的概率均為1/n,要求復(fù)雜度最低。
3.有10個(gè)文件,每個(gè)文件1G,
每個(gè)文件的每一行都存放的是用戶的query,每個(gè)文件的query都可能重復(fù)。
要求按照query的頻度排序.
85.又見字符串的問題
1.給出一個(gè)函數(shù)來復(fù)制兩個(gè)字符串A和B。
字符串A的后幾個(gè)字節(jié)和字符串B的前幾個(gè)字節(jié)重疊。
分析:記住,這種題目往往就是考你對(duì)邊界的考慮情況。
2.已知一個(gè)字符串,比如asderwsde,尋找其中的一個(gè)子字符串比如sde的個(gè)數(shù),
如果沒有返回0,有的話返回子字符串的個(gè)數(shù)。
86.
怎樣編寫一個(gè)程序,把一個(gè)有序整數(shù)數(shù)組放到二叉樹中?
分析:本題考察二叉搜索樹的建樹方法,簡(jiǎn)單的遞歸結(jié)構(gòu)。
關(guān)于樹的算法設(shè)計(jì)一定要聯(lián)想到遞歸,因?yàn)闃浔旧砭褪沁f歸的定義。
而,學(xué)會(huì)把遞歸改稱非遞歸也是一種必要的技術(shù)。
畢竟,遞歸會(huì)造成棧溢出,關(guān)于系統(tǒng)底層的程序中不到非不得以最好不要用。
但是對(duì)某些數(shù)學(xué)問題,就一定要學(xué)會(huì)用遞歸去解決。
87.
1.大整數(shù)數(shù)相乘的問題。(這是2002年在一考研班上遇到的算法題)
2.求最大連續(xù)遞增數(shù)字串(如“ads3sl456789DF3456ld345AA”中的“456789”)
3.實(shí)現(xiàn)strstr功能,即在父串中尋找子串首次出現(xiàn)的位置。
(筆試中常讓面試者實(shí)現(xiàn)標(biāo)準(zhǔn)庫(kù)中的一些函數(shù))
88.2005年11月金山筆試題。編碼完成下面的處理函數(shù)。
函數(shù)將字符串中的字符'*'移到串的前部分,
前面的非'*'字符后移,但不能改變非'*'字符的先后順序,函數(shù)返回串中字符'*'的數(shù)量。
如原始串為:ab**cd**e*12,
處理后為*****abcde12,函數(shù)并返回值為5。(要求使用盡量少的時(shí)間和輔助空間)
89.神州數(shù)碼、華為、東軟筆試題
1.2005年11月15日華為軟件研發(fā)筆試題。實(shí)現(xiàn)一單鏈表的逆轉(zhuǎn)。
2.編碼實(shí)現(xiàn)字符串轉(zhuǎn)整型的函數(shù)(實(shí)現(xiàn)函數(shù)atoi的功能),據(jù)說是神州數(shù)碼筆試題。如將字符
串 ”+123”123, ”-0123”-123, “123CS45”123, “123.45CS”123, “CS123.45”0
3.快速排序(東軟喜歡考類似的算法填空題,又如堆排序的算法等)
4.刪除字符串中的數(shù)字并壓縮字符串。
如字符串”abc123de4fg56”處理后變?yōu)?#8221;abcdefg”。注意空間和效率。
(下面的算法只需要一次遍歷,不需要開辟新空間,時(shí)間復(fù)雜度為O(N))
5.求兩個(gè)串中的第一個(gè)最長(zhǎng)子串(神州數(shù)碼以前試題)。
如"abractyeyt","dgdsaeactyey"的最大子串為"actyet"。
90.
1.不開辟用于交換數(shù)據(jù)的臨時(shí)空間,如何完成字符串的逆序
(在技術(shù)一輪面試中,有些面試官會(huì)這樣問)。
2.刪除串中指定的字符
(做此題時(shí),千萬(wàn)不要開辟新空間,否則面試官可能認(rèn)為你不適合做嵌入式開發(fā))
3.判斷單鏈表中是否存在環(huán)。
91.
1.一道著名的毒酒問題
有1000桶酒,其中1桶有毒。而一旦吃了,毒性會(huì)在1周后發(fā)作。
現(xiàn)在我們用小老鼠做實(shí)驗(yàn),要在1周內(nèi)找出那桶毒酒,問最少需要多少老鼠。
2.有趣的石頭問題
有一堆1萬(wàn)個(gè)石頭和1萬(wàn)個(gè)木頭,對(duì)于每個(gè)石頭都有1個(gè)木頭和它重量一樣,
把配對(duì)的石頭和木頭找出來。
92.
1.多人排成一個(gè)隊(duì)列,我們認(rèn)為從低到高是正確的序列,但是總有部分人不遵守秩序。
如果說,前面的人比后面的人高(兩人身高一樣認(rèn)為是合適的),
那么我們就認(rèn)為這兩個(gè)人是一對(duì)“搗亂分子”,比如說,現(xiàn)在存在一個(gè)序列:
176, 178, 180, 170, 171
這些搗亂分子對(duì)為
<176, 170>, <176, 171>, <178, 170>, <178, 171>, <180, 170>, <180, 171>,
那么,現(xiàn)在給出一個(gè)整型序列,請(qǐng)找出這些搗亂分子對(duì)的個(gè)數(shù)(僅給出搗亂分子對(duì)的數(shù)目即可,不用具體的對(duì))
要求:
輸入:
為一個(gè)文件(in),文件的每一行為一個(gè)序列。序列全為數(shù)字,數(shù)字間用”,”分隔。
輸出:
為一個(gè)文件(out),每行為一個(gè)數(shù)字,表示搗亂分子的對(duì)數(shù)。
詳細(xì)說明自己的解題思路,說明自己實(shí)現(xiàn)的一些關(guān)鍵點(diǎn)。
并給出實(shí)現(xiàn)的代碼 ,并分析時(shí)間復(fù)雜度。
限制:
輸入每行的最大數(shù)字個(gè)數(shù)為100000個(gè),數(shù)字最長(zhǎng)為6位。程序無(wú)內(nèi)存使用限制。
93.在一個(gè)int數(shù)組里查找這樣的數(shù),它大于等于左側(cè)所有數(shù),小于等于右側(cè)所有數(shù)。
直觀想法是用兩個(gè)數(shù)組a、b。a[i]、b[i]分別保存從前到i的最大的數(shù)和從后到i的最小的數(shù),
一個(gè)解答:這需要兩次遍歷,然后再遍歷一次原數(shù)組,
將所有data[i]>=a[i-1]&&data[i]<=b[i]的data[i]找出即可。
給出這個(gè)解答后,面試官有要求只能用一個(gè)輔助數(shù)組,且要求少遍歷一次。
94.微軟筆試題
求隨機(jī)數(shù)構(gòu)成的數(shù)組中找到長(zhǎng)度大于=3的最長(zhǎng)的等差數(shù)列9 d- x' W) w9 ?" o3 b0 R
輸出等差數(shù)列由小到大:
如果沒有符合條件的就輸出
格式:
輸入[1,3,0,5,-1,6]
輸出[-1,1,3,5]
要求時(shí)間復(fù)雜度,空間復(fù)雜度盡量小
95.華為面試題
1 判斷一字符串是不是對(duì)稱的,如:abccba
2.用遞歸的方法判斷整數(shù)組a[N]是不是升序排列
96.08年中興校園招聘筆試題
1.編寫strcpy 函數(shù)
已知strcpy 函數(shù)的原型是
char *strcpy(char *strDest, const char *strSrc);
其中strDest 是目的字符串,strSrc 是源字符串。不調(diào)用C++/C 的字符串庫(kù)函數(shù),請(qǐng)
編寫函數(shù) strcpy
最后壓軸之戲,終結(jié)此微軟等100題系列V0.1版。
那就,
連續(xù)來幾組微軟公司的面試題,讓你一次爽個(gè)夠:
======================
97.第1組微軟較簡(jiǎn)單的算法面試題
1.編寫反轉(zhuǎn)字符串的程序,要求優(yōu)化速度、優(yōu)化空間。
2.在鏈表里如何發(fā)現(xiàn)循環(huán)鏈接?
3.編寫反轉(zhuǎn)字符串的程序,要求優(yōu)化速度、優(yōu)化空間。
4.給出洗牌的一個(gè)算法,并將洗好的牌存儲(chǔ)在一個(gè)整形數(shù)組里。
5.寫一個(gè)函數(shù),檢查字符是否是整數(shù),如果是,返回其整數(shù)值。
(或者:怎樣只用4行代碼編寫出一個(gè)從字符串到長(zhǎng)整形的函數(shù)?)
98.第2組微軟面試題
1.給出一個(gè)函數(shù)來輸出一個(gè)字符串的所有排列。
2.請(qǐng)編寫實(shí)現(xiàn)malloc()內(nèi)存分配函數(shù)功能一樣的代碼。
3.給出一個(gè)函數(shù)來復(fù)制兩個(gè)字符串A和B。字符串A的后幾個(gè)字節(jié)和字符串B的前幾個(gè)字節(jié)重疊。
4.怎樣編寫一個(gè)程序,把一個(gè)有序整數(shù)數(shù)組放到二叉樹中?
5.怎樣從頂部開始逐層打印二叉樹結(jié)點(diǎn)數(shù)據(jù)?請(qǐng)編程。
6.怎樣把一個(gè)鏈表掉個(gè)順序(也就是反序,注意鏈表的邊界條件并考慮空鏈表)?
99.第3組微軟面試題
1.燒一根不均勻的繩,從頭燒到尾總共需要1個(gè)小時(shí)。
現(xiàn)在有若干條材質(zhì)相同的繩子,問如何用燒繩的方法來計(jì)時(shí)一個(gè)小時(shí)十五分鐘呢?
2.你有一桶果凍,其中有黃色、綠色、紅色三種,閉上眼睛抓取同種顏色的兩個(gè)。
抓取多少個(gè)就可以確定你肯定有兩個(gè)同一顏色的果凍?(5秒-1分鐘)
3.如果你有無(wú)窮多的水,一個(gè)3公升的提捅,一個(gè)5公升的提捅,兩只提捅形狀上下都不均勻,
問你如何才能準(zhǔn)確稱出4公升的水?(40秒-3分鐘)
一個(gè)岔路口分別通向誠(chéng)實(shí)國(guó)和說謊國(guó)。
來了兩個(gè)人,已知一個(gè)是誠(chéng)實(shí)國(guó)的,另一個(gè)是說謊國(guó)的。
誠(chéng)實(shí)國(guó)永遠(yuǎn)說實(shí)話,說謊國(guó)永遠(yuǎn)說謊話。現(xiàn)在你要去說謊國(guó),
但不知道應(yīng)該走哪條路,需要問這兩個(gè)人。請(qǐng)問應(yīng)該怎么問?(20秒-2分鐘)
100.第4組微軟面試題,挑戰(zhàn)思維極限
1.12個(gè)球一個(gè)天平,現(xiàn)知道只有一個(gè)和其它的重量不同,問怎樣稱才能用三次就找到那個(gè)球。
13個(gè)呢?(注意此題并未說明那個(gè)球的重量是輕是重,所以需要仔細(xì)考慮)(5分鐘-1小時(shí))
2.在9個(gè)點(diǎn)上畫10條直線,要求每條直線上至少有三個(gè)點(diǎn)?(3分鐘-20分鐘)
3.在一天的24小時(shí)之中,時(shí)鐘的時(shí)針、分針和秒針完全重合在一起的時(shí)候有幾次?
都分別是什么時(shí)間?你怎樣算出來的?(5分鐘-15分鐘)
終結(jié)附加題:
微軟面試題,挑戰(zhàn)你的智商
==========
說明:如果你是第一次看到這種題,并且以前從來沒有見過類似的題型,
并且能夠在半個(gè)小時(shí)之內(nèi)做出答案,說明你的智力超常..)
1.第一題 . 五個(gè)海盜搶到了100顆寶石,每一顆都一樣大小和價(jià)值連城。他們決定這么分:
抽簽決定自己的號(hào)碼(1、2、3、4、5)
首先,由1號(hào)提出分配方案,然后大家表決,當(dāng)且僅當(dāng)超過半數(shù)的人同意時(shí),
按照他的方案進(jìn)行分配,否則將被扔進(jìn)大海喂鯊魚
如果1號(hào)死后,再由2號(hào)提出分配方案,然后剩下的4人進(jìn)行表決,
當(dāng)且僅當(dāng)超過半數(shù)的人同意時(shí),按照他的方案進(jìn)行分配,否則將被扔入大海喂鯊魚。
依此類推
條件:每個(gè)海盜都是很聰明的人,都能很理智地做出判斷,從而做出選擇。
問題:第一個(gè)海盜提出怎樣的分配方案才能使自己的收益最大化?
2.一道關(guān)于飛機(jī)加油的問題,已知:
每個(gè)飛機(jī)只有一個(gè)油箱,
飛機(jī)之間可以相互加油(注意是相互,沒有加油機(jī))
一箱油可供一架飛機(jī)繞地球飛半圈,
問題:
為使至少一架飛機(jī)繞地球一圈回到起飛時(shí)的飛機(jī)場(chǎng),至少需要出動(dòng)幾架飛機(jī)?
(所有飛機(jī)從同一機(jī)場(chǎng)起飛,而且必須安全返回機(jī)場(chǎng),不允許中途降落,中間沒有飛機(jī)場(chǎng))
//歡迎,關(guān)注另外不同的更精彩的100題V0.2版,和此V0.1版的答案等后續(xù)內(nèi)容。
本微軟等面試100題系列V0.1版,完。
===================
關(guān)于本微軟等公司數(shù)據(jù)結(jié)構(gòu)+算法面試100題V0.1版
1.關(guān)于本微軟等100題系列V0.1版的鄭重聲明
http://blog.csdn.net/v_JULY_v/archive/2010/12/02/6050133.aspx
2.所有的資源下載(題目+答案)地址:
http://v_july_v.download.csdn.net/
3.本微軟等100題系列V0.1版,永久維護(hù)地址:
http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html
4.一切的詳情,還是在本博客里。
本博客致力于數(shù)據(jù)結(jié)構(gòu)之法、算法優(yōu)化之道
請(qǐng)參見本人博客:
My Blog:
http://blog.csdn.net/v_JULY_v
==============================================================
致各位網(wǎng)友
一、首先感謝各位,一路來對(duì)本微軟等100題系列的支持。謝謝大家。
二、歡迎,希望,各位網(wǎng)友能更多的、更好的提出你的個(gè)人思路、算法,
思路回復(fù)地址:
本微軟等100題系列V0.1版,永久維護(hù)地址
http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html
謝謝。
三、本微軟等100題系列,以后將會(huì)陸續(xù)推出V0.2版,V0.3版,V最終完美版,
接下來,我將會(huì)不斷出同樣來自微軟等數(shù)家大公司更具價(jià)值更精彩的另外不同的100道題,
請(qǐng),繼續(xù)關(guān)注。謝謝。
四、最后,我將把我這所有的工作,整理成一本PDF完整書,放在網(wǎng)上免費(fèi)閱讀。
以最大的無(wú)私,奉獻(xiàn)給各位最熱心的網(wǎng)友們。謝謝,你們。
五、而后,請(qǐng)大家務(wù)必尊重本人近2個(gè)月的勞動(dòng)成果。不論你是引用我帖子上,博客上,
還是各資源上的題目或答案,
凡是以July為名發(fā)表的博客、帖子,資源,引用都請(qǐng)注明作者本人July及出處。
若私自據(jù)為己有者,不標(biāo)明出處及作者本人,必究。
向您的厚道,致以最崇高的敬意。
六、目前,針對(duì)本100題系列,我已建一個(gè)100題系列各版本維護(hù)組,
專門針對(duì)這100題各個(gè)版本進(jìn)行維護(hù)、修正,若哪位也有此意愿的,歡迎聯(lián)系我。
My Blog:
http://blog.csdn.net/v_JULY_v
//預(yù)計(jì)本微軟等面試100題系列V0.2版,相信,會(huì)在明年2011年與大家見面,具體待定。
再會(huì)。:D。
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/v_JULY_v/archive/2010/12/06/6057286.aspx