自己做的答案僅作參考 一、選擇題(每題5分) 1. 鏈表不具有的特點是( B)。 (A) 不必事先估計存儲空間; (B) 可隨機訪問任一元素; (C) 插入刪除不需要移動元素; (D) 所需空間與線性表長度成正比; 2. 下列數據結構中,按先進後出原則組織數據的是(D) (A) 線性鏈表; (B) 順序表; (C)循環鏈表; (D) 棧; 3. 如果定義一個C++類CDate, 語句“CDate *p = newCDate;”的含義是(A )。 (A) 調用CDate類的缺省構造函數從內存中分配一個CDate類型的對象,並將該對象地址賦值給指針p; (B) 調用CDate類的拷貝構造函數從內存中分配一個CDate類型的對象,並將該對象地址賦值給指針p; (C) 調用CDate類的析構函數從內存中分配一個CDate類型的對象,並將該對象地址賦值給指針p; (D) 從內存中釋放指針p所指向的CDate類的對象; 4. 下列關於靜態數據成員正確的是( B) (A) 可以通過this指針訪問靜態數據; (B) 可以用類名和作用域訪問靜態數據; (C) 靜態數據在類內聲明並初始化; (D)只能由該類的靜態成員函數訪問; 5. 在TCP/IP協議棧裡,如果出現阻塞的情況,下面那種情況最有可能發生? ( A) (A) 連接錯誤 (B) 釋放緩存 (C) 包錯誤 (D) 丟包 6. 下面的類圖表示的是哪個設計模式?(D) (A) 代理模式(Proxy) (B) 裝飾模式(Decorator) (C) 橋接模式(Bridge) (D) 觀察者模式(Observer) 二、簡答題(每題7分) 1. C++中指針和引用有什麼區別 答: 1.引用訪問一個變量是直接訪問,而指針是間接訪問。 2.引用是一個變量的別名,本身不單獨分配自己的內存空間,而指針有自己的內存空間。 3.引用在開始的時候就綁定到了一個內存空間(開始必須賦初值),所以他只能是這個內存空間的名字,而不能改成其他的,當然可以改變這個內存空間的值. 2. C++特點是什麼,如何實現多態?畫出基類和子類在內存中的相互關系 繼承,封裝,多態 用虛函數實現多態 子類可以繼承父類的非私有數據成員 3. 請寫一個算法刪除數組[1,1,1,2,2,2,2,2,7,7,1,5,5,5,0]中重復的數字,使其轉變成1,2,7,1,5,0 voidNoReplicatedSubstring(int s[],int len) { vector <int> vectTemp; int nData= s[0]; vectTemp.push_back(nData); for(int i=1;i<len;i++) { if(s[i] == nData) { continue; } else { nData =s[i]; vectTemp.push_back(s[i]); } } } 4. 一次遍歷找鏈表倒數第n個節點,要求通過一次遍歷找到鏈表中倒數第n個節點,鏈表可能相當大,可使用輔助空間,但是輔助空間的數目必須固定,不能和n有關。 答案: ListNode*NodeInList(ListNode* pHead,int Num) { if(pHead==NULL) return NULL; ListNode* pNode=pHead; //當前結點 ListNode* pMidNode=pHead;//倒數Num個結點 while(Num) { if(pNode->m_pNext!=NULL) pNode=pNode->m_pNext->m_pNext; Num--; } while(pNode->m_pNext!=NULL&&pNode->m_pNext->m_pNext!=NULL) { pNode=pNode->m_pNext->m_pNext; pMidNode=pMidNode->m_pNext; } return pMidNode; } 5. TCP/IP 建立連接的過程?(3-way shake) 答: Client與server建立TCP連接時:首先Client向server發SYN(請求),然後server回復(應答請求),最後Client回復,這樣TCP就建立一次連接(三次握手)的過程就建立了 6. 使用udp和tcp進程網絡傳輸,為什麼tcp能保證包是發送順序,而 udp無法保證? 1.主機每次發送數據時,TCP就給每個數據包分配一個序列號並且在一個特定的時間內等待接收主機對分配的這個序列號進行確認,如果發送主機在一個特定時間內沒有收到接收主機的確認,則發送主機會重傳此數據包。接收主機利用序列號對接收的數據進行確認,以便檢測對方發送的數據是否有丟失或者亂序等,接收主機一旦收到已經順序化的數據,它就將這些數據按正確的順序重組成數據流並傳遞到高層進行處理。 2.UDP不提供可靠的數據傳輸!一個端口發往同一個目的端口的幾個數據包的順序可能會出現混亂 7. Linux epoll的LT(level triggered)與ET(edge-triggered)工作方式的區別? 答: LT:水平觸發,效率會低於ET觸發,尤其在大並發,大流量的情況下。但是LT對代碼編寫要求比較低,不容易出現問題。LT模式服務編寫上的表現是:只要有數據沒有被獲取,內核就不斷通知你,因此不用擔心事件丟失的情況。 ET:邊緣觸發,效率非常高,在並發,大流量的情況下,會比LT少很多epoll的系統調用,因此效率高。但是對編程要求高,需要細致的處理每個請求,否則容易發生丟失事件的情況。 從本質上講:與LT相比,ET模型是通過減少系統調用來達到提高並行效率的。 8. 網絡編程中設計並發服務器,使用多進程與多線程 ,請問有什麼區別? 答: 兩者都可以提高程序的並發度,提高程序運行效率和響應時間。線程和進程在使用上各有優缺點:線程執行開銷小,但不利於資源管理和保護;而進程正相反。同時,線程適合於在SMP機器上運行,而進程則可以跨機器遷移 9. 請列舉進程間通迅都有哪些方式?並說明工作方式,優缺點等。 常見三種方式:管道,消息緩沖,共享內存 1.無名管道簡單方便.但局限於單向通信的工作方式.並且只能在創建它的進程及其子孫進程之間實現管道的共享;有名管道雖然可以提供給任意關系的進程使用.但是由於其長期存在於系統之中,使用不當容易出錯。 2.消息緩沖,使用方便,但是信息的復制需要額外消耗CPU的時間.不適宜於信息量大或操作頻繁的場合。 3.共享內存,針對消息緩沖的缺點改而利用內存緩沖區直接交換信息,無須復制,快捷、信息量大是其優點但是不方便網絡通信。 10. 你讓一些人為你工作了七天,你要用一根金條作為報酬。金條被分成七小塊,每天給出一塊,如果你只能將金條切割兩次,你怎樣分給這些工人? 第一次切割七分之一 第二次切割七分之二 這樣就分為三段 七分之一一段 七分之二一段 七分之四一段 然後根據每天工作量交換