IT公司面試手冊(cè)_第1頁(yè)
IT公司面試手冊(cè)_第2頁(yè)
IT公司面試手冊(cè)_第3頁(yè)
IT公司面試手冊(cè)_第4頁(yè)
IT公司面試手冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

經(jīng)典word整理文檔,僅參考,雙擊此處可刪除頁(yè)眉頁(yè)腳。本資料屬于網(wǎng)絡(luò)整理,如有侵權(quán),請(qǐng)聯(lián)系刪除,謝謝!第一部分1.棧和隊(duì)列的共同特點(diǎn)是什么?答案:只允許在端點(diǎn)處插入和刪除元素。2.棧通常采用的兩種存儲(chǔ)結(jié)構(gòu)是什么?答案:線性存儲(chǔ)結(jié)構(gòu)和鏈表存儲(chǔ)結(jié)構(gòu)。3.下列關(guān)于棧的敘述正確的是(D)A.棧是非線性結(jié)構(gòu)B.棧是一種樹狀結(jié)構(gòu)C.棧具有先進(jìn)先出的特征D.棧有后進(jìn)先出的特征4.鏈表不具有的特點(diǎn)是(B)A.不必事先估計(jì)存儲(chǔ)空間B.可隨機(jī)訪問(wèn)任一元素C.插入刪除不需要移動(dòng)元素D.所需空間與線性表長(zhǎng)度成正比5.用鏈表表示線性表的優(yōu)點(diǎn)是什么?答案:便于插入和刪除操作。6.在單鏈表中,增加頭結(jié)點(diǎn)的目的是?答案:方便運(yùn)算的實(shí)現(xiàn)。7.循環(huán)鏈表的主要優(yōu)點(diǎn)是什么?答案:從表中任一結(jié)點(diǎn)出發(fā)都能訪問(wèn)到整個(gè)鏈表。8.線性表L=(a1,a2,a3,……ai,……D)A.每個(gè)元素都有一個(gè)直接前件和直接后件B.線性表中至少要有一個(gè)元素C.表中諸元素的排列順序必須是由小到大或由大到小D.除第一個(gè)和最后一個(gè)元素外,其余每個(gè)元素都有一個(gè)且只有一個(gè)直接前件和直接后件9.線性表若采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)時(shí),要求內(nèi)存中可用存儲(chǔ)單元的地址(D)A.必須是連續(xù)的B.部分地址必須是連續(xù)的C.一定是不連續(xù)的D.連續(xù)不連續(xù)都可以10.線性表的順序存儲(chǔ)結(jié)構(gòu)和線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)分別是?答案:隨機(jī)存取的存儲(chǔ)結(jié)構(gòu)和順序存取的存儲(chǔ)結(jié)構(gòu)。11.樹是結(jié)點(diǎn)的集合,它的根結(jié)點(diǎn)數(shù)目是多少?答案:有且只有112.在深度為5的滿二叉樹中,葉子結(jié)點(diǎn)的個(gè)數(shù)為?答案:3113.具有3個(gè)結(jié)點(diǎn)的二叉樹有多少種形態(tài)?答案:5種形態(tài)。14.設(shè)一棵二叉樹中有3個(gè)葉子結(jié)點(diǎn),有8個(gè)度為1的結(jié)點(diǎn),則該二叉樹中總的結(jié)點(diǎn)數(shù)為多少?答案:1315.已知二叉樹后序遍歷序列是,中序遍歷序列是,它的前序遍歷序列是?答案:cedba16.已知一棵二叉樹前序遍歷和中序遍歷分別為,則該二叉樹的后序遍歷為?答案:DGEBHFCAABDEGCFH和17.若某二叉樹的前序遍歷訪問(wèn)順序是,中序遍歷訪問(wèn)順序是,則其后序遍歷的結(jié)點(diǎn)訪問(wèn)順序是?答案:gdbehfca第二部分1.在計(jì)算機(jī)中,算法是指什么?答案:解題方案的準(zhǔn)確而完整的描述。2.在下列選項(xiàng)中,哪個(gè)不是一個(gè)算法一般應(yīng)該具有的基本特征?說(shuō)明:算法的四個(gè)基本特征是:可行性、確定性、有窮性和擁有足夠的情報(bào)。答案:無(wú)窮性。3.算法一般都可以用哪幾種控制結(jié)構(gòu)組合而成?答案:順序、選擇、循環(huán)。4.算法的時(shí)間復(fù)雜度是指?答案:算法執(zhí)行過(guò)程中所需要的基本運(yùn)算次數(shù)。5.算法的空間復(fù)雜度是指?答案:執(zhí)行過(guò)程中所需要的存儲(chǔ)空間。6.算法分析的目的是?答案:分析算法的效率以求改進(jìn)。7.下列敘述正確的是()A.算法的執(zhí)行效率與數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)無(wú)關(guān)B.算法的空間復(fù)雜度是指算法程序中指令(或語(yǔ)句)的條數(shù).算法的有窮性是指算法必須能在執(zhí)行有限個(gè)步驟之后終止D.算法的時(shí)間復(fù)雜度是指執(zhí)行算法程序所需要的時(shí)間8.數(shù)據(jù)結(jié)構(gòu)作為計(jì)算機(jī)的一門學(xué)科,主要研究什么?答案:主要研究數(shù)據(jù)的邏輯結(jié)構(gòu)、對(duì)各種數(shù)據(jù)結(jié)構(gòu)進(jìn)行的運(yùn)算,以及數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)。9.數(shù)據(jù)結(jié)構(gòu)中與所使用的計(jì)算機(jī)無(wú)關(guān)的是數(shù)據(jù)的()A.存儲(chǔ)結(jié)構(gòu).物理結(jié)構(gòu).邏輯結(jié)構(gòu).物理和存儲(chǔ)結(jié)構(gòu)10.下列敘述中,錯(cuò)誤的是(B)A.?dāng)?shù)據(jù)的存儲(chǔ)結(jié)構(gòu)與數(shù)據(jù)處理的效率密切相關(guān)B.?dāng)?shù)據(jù)的存儲(chǔ)結(jié)構(gòu)與數(shù)據(jù)處理的效率無(wú)關(guān).?dāng)?shù)據(jù)的存儲(chǔ)結(jié)構(gòu)在計(jì)算機(jī)中所占的空間不一定是連續(xù)的D.一種數(shù)據(jù)的邏輯結(jié)構(gòu)可以有多種存儲(chǔ)結(jié)構(gòu)11.數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)是指什么?答案:數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)中的表示。12.數(shù)據(jù)的邏輯結(jié)構(gòu)是指?答案:反映數(shù)據(jù)元素之間邏輯關(guān)系的數(shù)據(jù)結(jié)構(gòu)。13.根據(jù)數(shù)據(jù)結(jié)構(gòu)中各數(shù)據(jù)元素之間前后件關(guān)系的復(fù)雜程度,一般將數(shù)據(jù)結(jié)構(gòu)分為?答案:線性結(jié)構(gòu)和非線性結(jié)構(gòu)。14.下列數(shù)據(jù)結(jié)構(gòu)具有記憶功能的是()A.隊(duì)列B.循環(huán)隊(duì)列.棧D.順序表15.下列數(shù)據(jù)結(jié)構(gòu)中,按先進(jìn)后出原則組織數(shù)據(jù)的是(B)A.線性鏈表B.棧.循環(huán)鏈表D.順序表16.遞歸算法一般需要利用什么實(shí)現(xiàn)?答案:隊(duì)列17.下列關(guān)于棧的敘述中正確的是()A.在棧中只能插入數(shù)據(jù)B.在棧中只能刪除數(shù)據(jù).棧是先進(jìn)先出的線性表D.棧是先進(jìn)后出的線性表18.由兩個(gè)棧共享一個(gè)存儲(chǔ)空間的好處是?答案:節(jié)省存儲(chǔ)空間,降低上溢發(fā)生的機(jī)率。19.下列關(guān)于隊(duì)列的敘述中正確的是()A.在隊(duì)列中只能插入數(shù)據(jù)B.在隊(duì)列中只能刪除數(shù)據(jù).隊(duì)列是先進(jìn)先出的線性表D.隊(duì)列是先進(jìn)后出的線性表20.下列敘述中,正確的是(D)A.線性鏈表中的各元素在存儲(chǔ)空間中的位置必須是連續(xù)的B.線性鏈表中的表頭元素一定存儲(chǔ)在其他元素的前面C.線性鏈表中的各元素在存儲(chǔ)空間中的位置不一定是連續(xù)的,但表頭元素一定存儲(chǔ)在其他元素的前面D.線性鏈表中的各元素在存儲(chǔ)空間中的位置不一定是連續(xù)的,且各元素的存儲(chǔ)順序也是任意的21.下列敘述中正確的是()A.線性表是線性結(jié)構(gòu)B.棧與隊(duì)列是非線性結(jié)構(gòu).線性鏈表是非線性結(jié)構(gòu)D.二叉樹是線性結(jié)構(gòu)22.線性表L=(……ai,……D)A.每個(gè)元素都有一個(gè)直接前件和直接后件B.線性表中至少要有一個(gè)元素.表中諸元素的排列順序必須是由小到大或由大到小D.除第一個(gè)元素和最后一個(gè)元素外,其余每個(gè)元素都有一個(gè)且只有一個(gè)直接前件和直接后件23.線性表若采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)時(shí),要求內(nèi)存中可用存儲(chǔ)單元的地址怎么樣?答案:連續(xù)不連續(xù)都可以。24.鏈表不具有的特點(diǎn)是(B)A.不必事先估計(jì)存儲(chǔ)空間B.可隨機(jī)訪問(wèn)任一元素.插入刪除不需要移動(dòng)元素D.所需空間與線性表長(zhǎng)度成正比25.在(D)中,只要指出表中任何一個(gè)結(jié)點(diǎn)的位置,就可以從它出發(fā)依次訪問(wèn)到表中其他所有結(jié)點(diǎn)。A.線性單鏈表B.雙向鏈表.線性鏈表D.循環(huán)鏈表26.以下數(shù)據(jù)結(jié)構(gòu)屬于非線性數(shù)據(jù)結(jié)構(gòu)的是()A.隊(duì)列B.線性表.二叉樹D.棧27.樹是結(jié)點(diǎn)的集合,它的根結(jié)點(diǎn)數(shù)目是多少?答案:有且只有1。28.在一棵二叉樹上第8層的結(jié)點(diǎn)數(shù)最多是?答案:12829.在深度為5的滿二叉樹中,葉子結(jié)點(diǎn)的個(gè)數(shù)為?答案:1630.在深度為5的滿二叉樹中,共有多少個(gè)結(jié)點(diǎn)?答案:3131.設(shè)一棵完全二叉樹共有699個(gè)結(jié)點(diǎn),則在該二叉樹中的葉子結(jié)點(diǎn)數(shù)為?答案:350NN+1)/2;若N為偶數(shù),則葉子結(jié)點(diǎn)數(shù)為。32.設(shè)有下列二叉樹,對(duì)此二叉樹中序遍歷的結(jié)果是(B)A.ABCDEFB.DBEAFC.ABDECFD.DEBFCA33.若某二叉樹的前序遍歷訪問(wèn)順序是,中序遍歷訪問(wèn)順序是,則其后序遍歷的結(jié)點(diǎn)訪問(wèn)順序是?答案:gdbehfca34.串的長(zhǎng)度是?答案:串中所含字符的個(gè)數(shù)。35.設(shè)有兩個(gè)串p和,求q在p中首次出現(xiàn)位置的運(yùn)算稱做?答案:模式匹配。36.N個(gè)頂點(diǎn)的連通圖中邊的條數(shù)至少為?答案:N-137.N個(gè)頂點(diǎn)的強(qiáng)連通圖的邊數(shù)至少有?答案:N38.對(duì)長(zhǎng)度為n次數(shù)為?答案:N39.最簡(jiǎn)單的交換排序方法是?答案:冒泡排序40.假設(shè)線性表的長(zhǎng)度為,則在最壞情況下,冒泡排序需要的比較次數(shù)為?答案:n(n-1)/241.在待排序的元素序列基本有序的前提下,效率最高的排序方法是?答案:冒泡排序42.在最壞情況下,下列順序方法中時(shí)間復(fù)雜度最小的是?答案:堆排序43.希爾排序法屬于?答案:插入類排序44.堆排序法屬于?答案:選擇類排序45.在下列幾種排序方法中,要求內(nèi)存量最大的是?答案:歸并排序46.已知數(shù)據(jù)表A中每個(gè)元素距其最終位置不遠(yuǎn),為節(jié)省時(shí)間,應(yīng)采用?答案:直接插入排序第三部分1.一個(gè)算法通常由哪兩種基本要素組成?答案:一是對(duì)數(shù)據(jù)對(duì)象的運(yùn)算和操作,二是算法的控制結(jié)構(gòu)。2.算法的復(fù)雜度主要包括什么?法的工作量大小分別稱為算法的空間復(fù)雜度和時(shí)間復(fù)雜度。3.什么是數(shù)據(jù)處理?包括插入、刪除、查找、更改等運(yùn)算,也包括對(duì)數(shù)據(jù)元素進(jìn)行分析。4.數(shù)據(jù)結(jié)構(gòu)是指?答案:數(shù)據(jù)結(jié)構(gòu)是指相互有關(guān)聯(lián)的數(shù)據(jù)元素的集合。5.數(shù)據(jù)結(jié)構(gòu)分為?答案:數(shù)據(jù)結(jié)構(gòu)分為邏輯結(jié)構(gòu)與存儲(chǔ)結(jié)構(gòu),線性鏈表屬于存儲(chǔ)結(jié)構(gòu)。6.數(shù)據(jù)結(jié)構(gòu)包括?答案:數(shù)據(jù)結(jié)構(gòu)包括數(shù)據(jù)的邏輯結(jié)構(gòu)和數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)。7.數(shù)據(jù)元素之間的任何關(guān)系都可以用什么來(lái)描述?答案:用前趨和后繼關(guān)系來(lái)描述。8.數(shù)據(jù)的邏輯結(jié)構(gòu)分為哪兩大類?答案:有線性結(jié)構(gòu)和非線性結(jié)構(gòu)兩大類。9.常用的存儲(chǔ)結(jié)構(gòu)有?答案:順序、鏈接、索引等存儲(chǔ)結(jié)構(gòu)。10.順序存儲(chǔ)方法是什么?元中。11.棧的基本運(yùn)算有哪三種?答案:入棧、退棧與讀棧頂元素。12.隊(duì)列主要有哪兩種基本運(yùn)算?答案:入隊(duì)運(yùn)算與退隊(duì)運(yùn)算。13.棧和隊(duì)列通常采用的存儲(chǔ)結(jié)構(gòu)是?答案:鏈?zhǔn)酱鎯?chǔ)和順序存儲(chǔ)。14.當(dāng)線性表采用順序存儲(chǔ)結(jié)構(gòu)實(shí)現(xiàn)存儲(chǔ)時(shí),其主要特點(diǎn)是?答案:邏輯結(jié)構(gòu)中相鄰的結(jié)點(diǎn)在存儲(chǔ)結(jié)構(gòu)中仍相鄰。15.循環(huán)隊(duì)列主要有兩種基本運(yùn)算?。16.當(dāng)循環(huán)隊(duì)列非空且隊(duì)尾指針等于對(duì)頭指針時(shí),說(shuō)明循環(huán)隊(duì)列已滿,不能進(jìn)行入隊(duì)運(yùn)算。這種情況稱為?答案:上溢。17.當(dāng)循環(huán)隊(duì)列為空時(shí),不能進(jìn)行退隊(duì)運(yùn)算,這種情況稱為?答案:下溢。第四部分1.判斷鏈表是否存在環(huán)型鏈表問(wèn)題判斷一個(gè)鏈表是否存在環(huán),例如下面這個(gè)鏈表就存在一個(gè)環(huán):例如:N1->N2->N3->N4->N5->N2就是一個(gè)有環(huán)的鏈表,環(huán)的開始結(jié)點(diǎn)是N5這里有一個(gè)比較簡(jiǎn)單的解法。設(shè)置兩個(gè)指針p1向前走一步,p2向前走兩步。直到p2碰到NULL則說(shuō)明存在環(huán)。structlink{intdata;link*next;};boolIsLoop(link*head){link*p1=head,*p2=head;if(head==NULL||head->next==NULL){returnfalse;}do{p1=p1->next;p2=p2->next->next;}while(p2&&p2->next&&p1!=p2);if(p1==p2)returntrue;elsereturnfalse;}2.鏈表反轉(zhuǎn)的問(wèn)題的問(wèn)題。例如:一個(gè)鏈表是這樣的:1->2->3->4->5通過(guò)反轉(zhuǎn)后成為5->4->3->2->1指針反轉(zhuǎn)后,利用已經(jīng)存儲(chǔ)的指針往后面繼續(xù)遍歷。源代碼如下:structlinka{intdata;linka*next;};voidreverse(linka*&head){if(head==NULL)return;linka*pre,*cur,*ne;pre=head;cur=head->next;while(cur){ne=cur->next;cur->next=pre;pre=cur;cur=ne;}head->next=NULL;head=pre;}的返回的節(jié)點(diǎn)的next域置為NULL。因?yàn)橐淖僪ead指針,所以我用了引用。算法的源代碼如下:linka*reverse(linka*p,linka*&head){if(p==NULL||p->next==NULL){head=p;returnp;}else{linka*tmp=reverse(p->next,head);tmp->next=p;returnp;}}3.判斷兩個(gè)數(shù)組中是否存在相同的數(shù)字的問(wèn)題字?這個(gè)問(wèn)題首先想到的是一個(gè)O(nlogn)組中的每個(gè)元素進(jìn)行binary。用C++實(shí)現(xiàn)代碼如下:boolfindcommon(inta[],intsize1,intb[],intsize2){inti;for(i=0;i{intstart=0,end=size2-1,mid;while(start<=end){mid=(start+end)/2;if(a[i]==b[mid])returntrue;elseif(a[i]end=mid-1;elsestart=mid+1;}}returnfalse;}后來(lái)發(fā)現(xiàn)有一個(gè)O(n)算法。因?yàn)閮蓚€(gè)數(shù)組都是排好序的。所以只要址,依次向前推進(jìn)。推進(jìn)的規(guī)則是比較兩個(gè)數(shù)組中的數(shù)字,小的那個(gè)如果這時(shí)還沒碰到相同的數(shù)字,說(shuō)明數(shù)組中沒有相同的數(shù)字。boolfindcommon2(inta[],intsize1,intb[],intsize2){inti=0,j=0;while(i{if(a[i]==b[j])returntrue;if(a[i]>b[j])j++;if(a[i]i++;}returnfalse;}4.最大子序列問(wèn)題給定一整數(shù)序列,A2,...AnA1~An的一個(gè)子序列Ai~Aj,使得Ai到Aj的和最大。例如:整數(shù)序列-2,11,-4,13,-5,2,-5,-3,12,-9的最大子序列的和為。法。利用三重循環(huán),依次求出所有子序列的和然后取最大的那個(gè)。當(dāng)然算法復(fù)雜度會(huì)達(dá)到個(gè)算法復(fù)雜度為O(n)的線性算法實(shí)現(xiàn),算法的來(lái)源于ProgrammingPearls一書。在給出線性算法之前,先來(lái)看一個(gè)對(duì)窮舉算法進(jìn)行優(yōu)化Sum(i,是A[i]...A[j]Sum(i,j+1)=Sum(i,j)+。利用這一個(gè)遞推,我們就可以得到下面這個(gè)算法:intmax_sub(inta[],intsize){inti,j,v,max=a[0];for(i=0;i{v=0;for(j=i;j{v=v+a[j];//Sum(i,j+1)=Sum(i,j)+A[j+1]if(v>max)max=v;}}returnmax;}源代碼實(shí)現(xiàn):intmax_sub2(inta[],intsize){inti,max=0,temp_sum=0;for(i=0;i{temp_sum+=a[i];if(temp_sum>max)max=temp_sum;elseif(temp_sum<0)temp_sum=0;}returnmax;}5.按單詞反轉(zhuǎn)字符串的問(wèn)題詞用空格分開。例如:Hereis經(jīng)過(guò)反轉(zhuǎn)后變?yōu)椋篿sHere字符和最后一個(gè)交換,第二個(gè)和倒數(shù)第二個(gè)交換,依次循環(huán)。其實(shí)按每一個(gè)單詞再反轉(zhuǎn)一次。這樣每個(gè)單詞又恢復(fù)了原來(lái)的順序。char*reverse_word(constchar*str){intlen=strlen(str);char*restr=newchar[len+1];strcpy(restr,str);inti,j;for(i=0,j=len-1;i{chartemp=restr[i];restr[i]=restr[j];restr[j]=temp;}intk=0;while(k{i=j=k;while(restr[j]!=''&&restr[j]!='')j++;k=j+1;j--;for(;i{chartemp=restr[i];restr[i]=restr[j];restr[j]=temp;}}returnrestr;}交換部分改為異或?qū)崿F(xiàn)。例如將chartemp=restr[i];restr[i]=restr[j];restr[j]=temp;改為restr[i]^=restr[j];restr[j]^=restr[i];restr[i]^=restr[j];6.刪除數(shù)組中重復(fù)的數(shù)字問(wèn)題0數(shù)字用一個(gè)數(shù)字代替。1,1,1,2,2,2,2,2,7,7,1,5,5,5,0轉(zhuǎn)變成1,2,7,1,5,0問(wèn)題比較簡(jiǎn)單,要注意的是這個(gè)數(shù)組是動(dòng)態(tài)的。所以避免麻煩我還是用了STL的。#include#includeusingnamespacestd;//removetheduplicatednumbersinanintgerarray,thearraywasendwith0;//e.g.1,1,1,2,2,5,4,4,4,4,1,0>1,2,5,4,1,0voidstaticremove_duplicated(inta[],vector&_st){_st.push_back(a[0]);for(inti=1;_st[_st.size()-1]!=0;i++){if(a[i-1]!=a[i])_st.push_back(a[i]);}}當(dāng)然如果可以改變?cè)瓉?lái)的數(shù)組的話,可以不用STL,僅需要指針操作就可以了。下面這個(gè)程序?qū)⑿薷脑瓉?lái)數(shù)組的內(nèi)容。voidstaticremove_duplicated2(inta[]){if(a[0]==0||a==NULL)return;intinsert=1,current=1;while(a[current]!=0){if(a[current]!=a[current-1]){a[insert]=a[current];insert++;current++;}elsecurrent++;}a[insert]=0;}7.如何判斷一棵二叉樹是否是平衡二叉樹問(wèn)題定義,如果任意節(jié)點(diǎn)的左右子樹的深度相差不超過(guò)1,那這棵樹就是平衡二叉樹。首先編寫一個(gè)計(jì)算二叉樹深度的函數(shù),利用遞歸實(shí)現(xiàn)。templatestaticintDepth(BSTreeNode*pbs){if(pbs==NULL)return0;else{intld=Depth(pbs->left);intrd=Depth(pbs->right);return1+(ld>rd?ld:rd);}}下面是利用遞歸判斷左右子樹的深度是否相差1來(lái)判斷是否是平衡二叉樹的函數(shù):templatestaticboolisBalance(BSTreeNode*pbs){if(pbs==NULL)returntrue;intdis=Depth(pbs->left)Depth(pbs->right);if(dis>1||dis<-1)returnfalse;elsereturnisBalance(pbs->left)&&isBalance(pbs->right);}第五部分微軟的22道數(shù)據(jù)結(jié)構(gòu)算法面試題(含答案)1、反轉(zhuǎn)一個(gè)鏈表。循環(huán)算法。1Listreverse(Listl){2if(!l)returnl;3listcur=l.next;4listpre=l;5listtmp;6pre.next=null;7while(cur){8tmp=cur;9cur=cur.next;10tmp.next=pre11pre=tmp;12}13returntmp;14}2、反轉(zhuǎn)一個(gè)鏈表。遞歸算法。1Listresverse(listl){2if(!l||!l.next)returnl;34Listn=reverse(l.next);5l.next.next=l;6l.next=null;7}8returnn;9}3、廣度優(yōu)先遍歷二叉樹。1voidBST(Treet){2Queueq=newQueue();3q.enque(t);4Treet=q.deque();5while(t){6System.out.println(t.value);7q.enque(t.left);8q.enque(t.right);9t=q.deque();10}11}———————-1classNode{2Treet;3Nodenext;4}5classQueue{6Nodehead;7Nodetail;8publicvoidenque(Treet){9Noden=newNode();10n.t=t;11if(!tail){12tail=head=n;13}else{14tail.next=n;15tail=n;16}17}18publicTreedeque(){19if(!head){20returnnull;21}else{22Noden=head;23head=head.next;24returnn.t;25}26}4、輸出一個(gè)字符串所有排列。注意有重復(fù)字符。1char[]p;2voidperm(chars[],inti,intn){3intj;4chartemp;5for(j=0;j6if(j!=0&&s[j]==s[j-1]);7elseif(s[j]!='@'){8p[i]=s[j];9s[j]='@';10if(i==n-1){11p[n]='\0';12printf("%s",p);13}else{14perm(s,i+1,n);15}16s[j]=p[i];17}18}19}--------------------------1voidmain(){2chars[N];3sort(s);4perm(s,0,strlen(s));5}5、輸入一個(gè)字符串,輸出長(zhǎng)型整數(shù)。1longatol(char*str){2char*p=str;3longl=1;m=0;4if(*p=='-'){5l=-1;6++p;7}8while(isDigit(*p)){9m=m*10+p;10++p;11}12if(!p)returnm*l;13elsereturnerror;14}6、判斷一個(gè)鏈表是否有循環(huán)。1intisLoop(Listl){2if(!l)return-1;3Lists=l.next;4while(s&&s!=l){5s=s.next;6}7if(!s)return-1;8elsereutrn1;9}-----------1intisLoop(Listl){2if(!l)return0;3p=l.next;4wihle(p!=l&&p!=null){5l.next=l;6l=p;p=p.next;7}8if(p=l)return1;9return0;10}實(shí)際上,在我的面試過(guò)程中,還問(wèn)到了不破壞結(jié)構(gòu)的其他算法。我的答案是從鏈表頭開始遍歷,如果節(jié)點(diǎn)next指針指向自身,則循環(huán)存在;否則將next指針指向自身,遍歷下一個(gè)節(jié)點(diǎn)。直至next指針為空,此時(shí)鏈表無(wú)循環(huán)。7、反轉(zhuǎn)一個(gè)字符串。1voidreverse(char*str){2chartmp;3intlen;4len=strlen(str);5for(inti=0;i<len/2;++i){6tmp=char[i];7str[i]=str[len-i-1];8str[len-i-1]=tmp;9}10}8、實(shí)現(xiàn)strstr函數(shù)。1intstrstr(char[]str,char[]par){2inti=0;3intj=0;4while(str[i]&&str[j]){5if(str[i]==par[j]){6++i;7++j;8}else{9i=i-j+1;10j=0;11}12}13if(!str[j])returni-strlen(par);14elsereturn-1;15}9、實(shí)現(xiàn)strcmp函數(shù)。1intstrcmp(char*str1,char*str2){2while(*str1&&*str2&&*str1==*str2){3++str1;4++str2;5}6return*str1-*str2;7}、求一個(gè)整形中1的位數(shù)。1intf(intx){2intn=0;3while(x){4++n;5x&=x-1;6}7returnn;8}、漢諾塔問(wèn)題。1voidtower(n,x,y,z){2if(n==1)move(x,z);3else{4tower(n-1,x,z,y);5move(x,z);6tower(n-1,y,x,z);7}8}、三柱漢諾塔最小步數(shù)。1intf3(n){2if(f3[n])returnf3[n];3else{4if(n==1){5f3[n]=1;6return1;7}8f3[n]=2*f3(n-1)+1;9returnf3[n];10}11}四柱漢諾塔最小步數(shù)。1intf4(n){2if(f4[n]==0){3if(n==1){4f4[1]==1;5return1;6}7min=2*f4(1)+f3(n-1);8for(inti=2;i9u=2*f4(i)+f3(n-i);10if(u11}12f4[n]=min;13returnmin;14}elsereturnf4[n];15}、在一個(gè)鏈表中刪除另一個(gè)鏈表中的元素。1voiddelete(Listm,Listn){2if(!m||!n)return;3Listpre=newList();4pre.next=m;5Lista=m,b=n,head=pre;6while(a&&b){7if(a.value<b.value){8a=a.next;9pre=pre.next;10}elseif(a.value>b.value){11b=b.next;12}else{13a=a.next;14pre.next=a;15}16}17m=head.next;18}、一個(gè)數(shù)組,下標(biāo)從0到n,元素為從0到n的整數(shù)。判斷其中是否有重復(fù)元素。1inthasDuplicate(int[]a,intn){2for(inti=0;i3while(a[i]!=i&&a[i]!=-1){4if(a[a[i]]==-1)return1;5a[i]=a[a[i]];6a[a[i]]=-1;7}8if(a[i]==i){a[i]=-1;}9}10return0;11}、判斷一顆二叉樹是否平衡。1intisB(Treet){2if(!t)return0;3intleft=isB(t.left);4intright=isB(t.right);5if(left>=0&&right>=0&&leftright<=1||left-right>=-1)6return(left7elsereturn-1;8}9、返回一顆二叉樹的深度。1intdepth(Treet){2if(!t)return0;3else{4inta=depth(t.right);5intb=depth(t.left);6return(a>b)?(a+1):(b+1);7}8}、兩個(gè)鏈表,一升一降。合并為一個(gè)升序鏈表。1Listmerge(Lista,Listd){2Lista1=rev

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論