




已閱讀5頁,還剩8頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第一部分1. 棧和隊列的共同特點是(只允許在端點處插入和刪除元素)2.棧通常采用的兩種存儲結構是(線性存儲結構和鏈表存儲結構)3.鏈表不具有的特點是(B)A. 不必事先估計存儲空間 B.可隨機訪問任一元素C.插入刪除不需要移動元素 D.所需空間與線性表長度成正比4.用鏈表表示線性表的優點是(便于插入和刪除操作)5.在單鏈表中,增加頭結點的目的是(方便運算的實現)6.循環鏈表的主要優點是(從表中任一結點出發都能訪問到整個鏈表)7.線性表若采用鏈式存儲結構時,要求內存中可用存儲單元的地址(D)A.必須是連續的 B.部分地址必須是連續的C.一定是不連續的 D.連續不連續都可以8.線性表的順序存儲結構和線性表的鏈式存儲結構分別是(隨機存取的存儲結構、順序存取的存儲結構)9.具有3個結點的二叉樹有(5種形態)10.設一棵二叉樹中有3個葉子結點,有8個度為1的結點,則該二叉樹中總的結點數為(13)(n0 = n2 +1)11.已知二叉樹后序遍歷序列是dabec,中序遍歷序列是debac,它的前序遍歷序列是(cedba)12. 若某二叉樹的前序遍歷訪問順序是abdgcefh,中序遍歷訪問順序是dgbaechf,則其后序遍歷的結點訪問順序是(gdbehfca)13.數據庫保護分為:安全性控制、完整性控制、并發性控制和數據的恢復。第二部分1.在計算機中,算法是指(解題方案的準確而完整的描述)2.算法一般都可以用哪幾種控制結構組合而成(順序、選擇、循環)3.算法的時間復雜度是指(算法執行過程中所需要的基本運算次數)4.算法的空間復雜度是指(執行過程中所需要的存儲空間)5.算法分析的目的是(分析算法的效率以求改進)6.下列敘述正確的是(C)A算法的執行效率與數據的存儲結構無關B算法的空間復雜度是指算法程序中指令(或語句)的條數C算法的有窮性是指算法必須能在執行有限個步驟之后終止D算法的時間復雜度是指執行算法程序所需要的時間7.數據結構作為計算機的一門學科,主要研究數據的邏輯結構、對各種數據結構進行的運算,以及(數據的存儲結構)8.數據結構中,與所使用的計算機無關的是數據的(C)A存儲結構 B物理結構 C邏輯結構 D物理和存儲結構9. 下列敘述中,錯誤的是(B)A 數據的存儲結構與數據處理的效率密切相關B數據的存儲結構與數據處理的效率無關C數據的存儲結構在計算機中所占的空間不一定是連續的D一種數據的邏輯結構可以有多種存儲結構10.數據的存儲結構是指(數據的邏輯結構在計算機中的表示)11.數據的邏輯結構是指(反映數據元素之間邏輯關系的數據結構)12.根據數據結構中各數據元素之間前后件關系的復雜程度,一般將數據結構分為(線性結構和非線性結構)13.下列數據結構具有記憶功能的是(C)A隊列 B循環隊列 C棧 D順序表14.遞歸算法一般需要利用(棧)實現。15.由兩個棧共享一個存儲空間的好處是(節省存儲空間,降低上溢發生的機率)16.與單向鏈表相比,雙向鏈表的優點之一是(更容易訪問相鄰結點)17.設一棵完全二叉樹共有699個結點,則在該二叉樹中的葉子結點數為(350)說明:完全二叉樹總結點數為N,若N為奇數,則葉子結點數為(N+1)/2;若N為偶數,則葉子結點數為N/2。18.串的長度是(串中所含字符的個數)19.設有兩個串p和q,求q在p中首次出現位置的運算稱做(模式匹配)20.N個頂點的連通圖中邊的條數至少為(N-1)21.N個頂點的強連通圖的邊數至少有(N)22.對長度為n的線性表進行順序查找,在最壞情況下所需要的比較次數為(n)23.最簡單的交換排序方法是(冒泡排序)24.假設線性表的長度為n,則在最壞情況下,冒泡排序需要的比較次數為(n(n-1)/2)25.在待排序的元素序列基本有序的前提下,效率最高的排序方法是(冒泡排序)26.希爾排序法屬于(插入類排序)27.堆排序法屬于(選擇類排序)28.已知數據表A中每個元素距其最終位置不遠,為節省時間,應采用(直接插入排序)29.算法的基本特征是有窮性、可行性、確定性和擁有足夠的情報。第三部分1.一個算法通常由兩種基本要素組成:一是對數據對象的運算和操作,二是算法的控制結構。2.所謂數據處理是指對數據集合中的各元素以各種方式進行運算,包括插入、刪除、查找、更改等運算,也包括對數據元素進行分析。3.數據結構是指相互有關聯的數據元素的集合。4.數據結構分為邏輯結構與存儲結構,線性鏈表屬于(存儲結構)。5.數據元素之間的任何關系都可以用前驅和后繼關系來描述。6.數據的邏輯結構有線性結構和非線性結構兩大類。7.常用的存儲結構有順序、鏈接、索引等存儲結構。8.棧的基本運算有三種:入棧、退棧與讀棧頂元素。9.隊列主要有兩種基本運算:入隊運算與退隊運算。10.在實際應用中,帶鏈的棧可以用來收集計算機存儲空間中所有空閑的存儲結點,這種帶鏈的棧稱為可利用棧。11.棧和隊列通常采用的存儲結構是鏈式存儲和順序存儲。12.循環隊列主要有兩種基本運算:入隊運算與退隊運算。每進行一次入隊運算,隊尾指針就進1。13.當循環隊列非空且隊尾指針等于隊頭指針時,說明循環隊列已滿,不能進行入隊運算。這種情況稱為上溢。14.當循環隊列為空時,不能進行退隊運算,這種情況稱為下溢。15.在一個容量為25的循環隊列中,若頭指針front=16,尾指針rear=9,則該循環隊列中共有18個元素。注:當rearfront時,元素個數rearfront。第四部分1、鏈表反轉(無表頭結點)單向鏈表的反轉是一個經常被問到的一個面試題,也是一個非常基礎的問題。比如一個鏈表是這樣的:1-2-3-4-5通過反轉后成為5-4-3-2-1。最容易想到的方法遍歷一遍鏈表,利用一個輔助指針,存儲遍歷過程中當前指針指向的下一個元素,然后將當前節點元素的指針反轉后,利用已經存儲的指針往后面繼續遍歷。源代碼如下:法一:typedef struct LNodeint data;LNode *next; LNode, *LinkList;void Reverse(LinkList &head)if (head = NULL)return;LNode *p, *q;p = head;head = NULL;while (p != NULL)q = p;p = p - next;q-next = head;head = q;LNode *pre, *cur, *nex;pre = head;cur = head-next;while (cur != NULL)nex = cur-next;cur-next = pre;pre = cur;cur = nex;head-next = NULL;head = pre;比較還有一種利用遞歸的方法。這種方法的基本思想是在反轉當前節點之前先調用遞歸函數反轉后續節點。不過,這個方法有一個缺點,就是在反轉后的最后一個結點會形成一個環,所以必須將函數返回的節點的next域置為NULL。因為要改變head指針,所以我用了引用。算法的源代碼如下:法二:LNode* Reverse(LNode *p, LinkList &head)if (p = NULL | p-next = NULL)head = p;return p;elseLNode *tmp = Reverse(p-next, head);tmp-next = p;p-next = NULL;return p;2.判斷一個鏈表是否存在環,例如下面這個鏈表就存在一個環:例如N1-N2-N3-N4-N5-N2就是一個有環的鏈表,環的開始結點是N5這里有一個比較簡單的解法。設置兩個指針p1,p2。每次循環p1向前走一步,p2向前走兩步。直到p2碰到NULL指針或者兩個指針相等結束循環。如果兩個指針相等則說明存在環。求環長:按照上面兩個指針不同步長步進的方法,第一次相遇時記錄當前指針,步長為1的指針繼續走,計數,直到再次來到記錄的指針,經過的步數即為環長。找環入口:根據所得環長Y,設置指針指向頭部,另一指針先向前走Y。若兩指針當前指向的node相同,則為入口,否則各自向前走1再判斷是否相等。struct Nodeint data;Node *next;bool IsLoop(Node *head)Node *p1 = head,*p2 = head;if (head = NULL | head-next = NULL)return false;dop1 = p1-next;p2 = p2-next-next; while (p2 & p2-next & p1 != p2);if (p1 = p2)return true;elsereturn false;3.判斷兩個數組中是否存在相同的數字:給定兩個排好序的數組,怎樣高效地判斷這兩個數組中存在相同的數字?這個問題首先想到的是一個O(nlogn)的算法。就是任意挑選一個數組,遍歷這個數組的所有元素,遍歷過程中,在另一個數組中對第一個數組中的每個元素進行binary search。用C+實現代碼如下:bool FindCommon(int a, int size1, int b, int size2)int i;for (i = 0; i size1; i+)int start = 0, end = size2-1, mid;while (start = end)mid = (start + end)/2;if (ai = bmid)return true;else if (ai bmid)end = mid - 1;elsestart = mid + 1;return false;后來發現有一個O(n)算法。因為兩個數組都是排好序的。所以只要一次遍歷就行了。首先設兩個下標,分別初始化為兩個數組的起始地址,依次向前推進。推進的規則是比較兩個數組中的數字,小的那個數組的下標向前推進一步,直到任何一個數組的下標到達數組末尾時,如果這時還沒碰到相同的數字,說明數組中沒有相同的數字。bool FindCommon2(int a, int size1, int b, int size2)int i = 0, j = 0;while (i size1 & j bj)j+;if (ai bj)i+;return false;4.“最大子序列”問題:給定一整數序列A1,A2,.,An(可能有負數),求A1An的一個子序列AiAj,使得Ai到Aj的和最大。例如:整數序列-2,11,-4,13,-5,2,-5,-3,12,-9的最大子序列的和為21。對于這個問題,最簡單也是最容易想到的那就是窮舉所有子序列的方法。利用三重循環,依次求出所有子序列的和然后取最大的那個。當然算法復雜度會達到O(n3)。顯然這種方法不是最優的,下面給出一個算法復雜度為O(n)的線性算法實現,算法的來源于Programming Pearls一書。在給出線性算法之前,先來看一個對窮舉算法進行優化的算法,它的算法復雜度為O(n2)。其實這個算法只是對窮舉算法稍微做了一些修改:其實子序列的和我們并不需要每次都重新計算一遍。假設Sum(i,j)是Ai.Aj的和,那么Sum(i,j+1) = Sum(i,j) + Aj+1。利用這一個遞推,我們就可以得到下面這個算法:int MaxSub(int a, int size)int i, j, v, max = a0;for (i = 0; i size; i+)v = 0;for (j = i; j max)max = v;return max;那怎樣才能達到線性復雜度呢?這里運用動態規劃的思想。先看一下源代碼實現:int MaxSub2(int a, int size)int i, max = 0, tempSum = 0;for (i = 0; i max)max = tempSum;else if (tempSum 0)tempSum = 0;return max;5.按單詞反轉字符串,并不是簡單的字符串反轉,而是按給定字符串里的單詞將字符串倒轉過來,就是說字符串里面的單詞還是保持原來的順序,這里的每個單詞用空格分開。例如:Here is 經過反轉后變為: is Here如果只是簡單的將所有字符串翻轉的話,可以遍歷字符串,將第一個字符和最后一個交換,第二個和倒數第二個交換,依次循環。其實按照單詞反轉的話可以在第一遍遍歷的基礎上,再遍歷一遍字符串,對每一個單詞再反轉一次。這樣每個單詞又恢復了原來的順序。char* ReverseWord(const char *str)int len = strlen(str);char *reStr = new charlen + 1;strcpy(reStr, str);int i, j;for (i = 0, j = len - 1; i j; i+, j-)char temp = reStri;reStri = reStrj;reStrj = temp;int k = 0;while (k len)i = j = k;while (reStrj != & reStrj != 0)j+;k = j + 1;j-;for (;i j; i+, j-)char temp = reStri;reStri = reStrj;reStrj = temp;return reStr;如果考慮空間和時間的優化的話,當然可以將上面代碼里兩個字符串交換部分改為異或實現。例如將char temp = reStri;reStri = reStrj;reStrj = temp;改為reStri = reStrj;reStrj = reStri;reStri = reStrj;6.字符串反轉。我沒有記錯的話是一道MSN的筆試題,網上無意中看到的,拿來做了一下。題目是這樣的,給定一個字符串,一個這個字符串的子串,將第一個字符串反轉,但保留子串的順序不變。例如:輸入:第一個字符串:This is fishskys Chinese site: /cn子串:fishsky輸出:nc/nc.moc.fishsky.www/:ptth :etis esenihC sfishsky si sihT一般的方法是先掃描一邊第一個字符串,然后用stack把它反轉,同時記錄下子串出現的位置。然后再掃描一遍把記錄下來的子串再用stack反轉。我用的方法是用一遍掃描數組的方法。掃描中如果發現子串,就將子串倒過來壓入堆棧。最后再將堆棧里的字符彈出,這樣子串又恢復了原來的順序。源代碼如下:#include #include #include using namespace std;/ reverse the string s1 except the substring token.const char* reverse(const char *s1, const char *token)assert(s1 & token);stack cStack;const char *pToken= token, *head = s1, *rear = s1;while (*head != 0)while(*head != 0 & *pToken = *head)ptoken+;head+;if (*pToken = 0) / contain the tokenconst char *p;for(p=head-1;p=rear;p-)cStack.push(*p);pToken = token;rear = head;elsecStack.push(*rear);head = +rear;pToken = token;char *pszRetValue = new charstrlen(s1)+1;int i=0;while(!cStack.empty()pszRetValuei+ = cStack.top();cStack.pop();pszRetValuei = 0;return pszRetValue;int main(int argc, char* argv)coutThis is fishskys Chinese site: /cn;coutreverse(This is fishskys Chinese site: /cn,fishsky );return 0;7. 刪除數組中重復的數字:一個動態長度可變的數字序列,以數字0為結束標志,要求將重復的數字用一個數字代替,例如:將數組1,1,1,2,2,2,2,2,7,7,1,5,5,5,0轉變成1,2,7,1,5,0問題比較簡單,要注意的是這個數組是動態的。所以避免麻煩我還是用了STL的vector。#include #include using namespace std;/remove the duplicated numbers in an intger array, the array was end with 0;/e.g.1,1,1,2,2,5,4,4,4,4,1,0-1,2,5,4,1,0void static rem
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 北國超市考試題及答案
- 外包字節java面試題及答案
- 長航招聘考試題及答案
- 色彩搭配試題及答案
- 藝術博士考試題及答案
- 車間腳踏池管理制度
- 軋花廠加工管理制度
- 過期原輔料管理制度
- 運營類資產管理制度
- 運輸部超載管理制度
- 金屬非金屬礦山安全標準化講義
- 2023宿遷地生中考試卷
- 一人力資源轉型和價值
- 設備采購質量保證措施
- 機房設備安裝工程及移動通信工程施工工藝圖解
- 國內生態工業園區發展分析
- YY/T 0292.1-1997醫用診斷X射線輻射防護器具第1部分:材料衰減性能的測定
- LY/T 1697-2017飾面木質墻板
- GB/T 97.1-2002平墊圈A級
- GB/T 5121.27-2008銅及銅合金化學分析方法第27部分:電感耦合等離子體原子發射光譜法
- GB/T 1449-2005纖維增強塑料彎曲性能試驗方法
評論
0/150
提交評論