百度面試總結

http://blog.csdn.net/zhaojinjia/article/details/12649823

面試官當時只給了一個小時的時間,只寫了一個鏈表反轉的程序還問了其他一些,列舉下來,希望網友看看下面,有新思路,請交流一下,謝謝。

1:實現帶頭結點的鏈表反轉問題

     兩種方法:遞歸和非遞歸實現

[cpp] view plaincopyprint?

  1. struct ListNode  
  2. {  
  3. int m_nKey;  
  4.     ListNode* m_pNext;  
  5. };  
  6. //非遞歸實現
  7. ListNode* ListReverse(ListNode* pHead)  
  8. {  
  9. if ( !pHead->m_pNext )  
  10. return pHead;       //如果鏈表只有頭結點,直接返回頭結點
  11.     ListNode *p1 = pHead->m_pNext;  
  12.     ListNode *p2 = p1->m_pNext;  
  13.     ListNode *p3;  
  14.     p1->m_pNext = NULL;      //這一步我面試時寫程序落下了------注意一下
  15. while ( p2 )  
  16.     {  
  17.         p3 = p2->m_pNext;    //先保存p2的next指針,防止丟失
  18.         p2->m_pNext = p1;    //修改p2的next指針,改爲指向p1
  19.         p1 = p2;            //p1向前移動
  20.         p2 = p3;            //p2向前移動
  21.     }  
  22.     pHead->m_pNext = p1;  
  23. return pHead;  
  24. }  
  25. //遞歸求鏈表反轉,返回值當前鏈表的最後一個結點
  26. ListNode* RecursiveListReverse(ListNode* pNode, ListNode*& pHead)  
  27. {  
  28. if ( !pNode )   //當沒有元素時處理
  29.     {  
  30. return pNode;  
  31.     }  
  32. if (!pNode->m_pNext) //噹噹前結點爲最後一個結點時,找到頭結點,固定不動
  33.     {  
  34.         pHead->m_pNext = NULL;  
  35.         pHead = pNode;  
  36. return pNode;  
  37.     }  
  38. else
  39.     {  
  40.         ListNode* temp = RecursiveListReverse(pNode->m_pNext, pHead);  
  41.         temp->m_pNext = pNode;  
  42.         temp = pNode;  
  43. return temp;  
  44.     }  
  45. }  
  46. void Traverse(ListNode* pHead)  
  47. {  
  48.     ListNode* pTemp = pHead->m_pNext;  
  49.     cout <<"output the list:   ";  
  50. if (!pTemp)  
  51.     {  
  52.         cout <<"空鏈表"<<endl;  
  53. return;  
  54.     }  
  55. while (pTemp)  
  56.     {  
  57.         cout << pTemp->m_nKey <<" ";  
  58.         pTemp = pTemp->m_pNext;  
  59.     }  
  60.     cout << endl;  
  61. }  
  62. //創建一個帶頭結點的鏈表
  63. ListNode* CreateList()  
  64. {  
  65.     cout<<"輸入空格間隔,-1爲結束表示 "<<endl;  
  66.     ListNode* pHead = new ListNode;     //建一個頭結點
  67.     pHead->m_pNext = NULL;  
  68.     ListNode* p = pHead;  
  69. int data;  
  70. while ( cin>>data && data!=-1 )  
  71.     {  
  72.         ListNode* pNew = new ListNode;  
  73.         pNew->m_nKey = data;  
  74.         pNew->m_pNext = NULL;  
  75.         p->m_pNext = pNew;  
  76.         p = p->m_pNext;  
  77.     }  
  78. return pHead;  
  79. }  
  80. int _tmain(int argc, _TCHAR* argv[])  
  81. {  
  82.     ListNode* pHead = CreateList();     //建立
  83.     Traverse(pHead);                    //輸出
  84.     pHead = ListReverse(pHead);         //鏈表反轉
  85.     Traverse(pHead);                    //輸出
  86.     RecursiveListReverse(pHead->m_pNext,pHead->m_pNext);  //遞歸鏈表反轉
  87.     Traverse(pHead);  
  88. return 0;  
  89. }  

2:一個數組長度爲N,且每個元素的範圍是1到N+2,且不重複出現,那麼1到N+2中肯定會有兩個數字沒有出現,要求用時間複雜度爲O(n),空間複雜度爲O(1)找出來。

     利用解方程思想:X+Y=一數,  X*Y=一數,可求出X和Y,但是當N較大時,這個方法不可取,求高效方法

3:虛擬內存(虛擬存儲器)

     背景:常規存儲器管理方式的特徵:一次性和駐留性。

     虛擬內存提出原因:1:有些作業很大,無法一下全部裝入內存;2:作業量很大,內存無法容納所有這些作業,只能將少數作業裝入內存,而將其他大量作業留在外存上。

虛擬內存是從邏輯上擴充內存容量解決問題的。

定義:具有請求調入功能和置換功能,能從邏輯上對內存容量進行擴充的一種存儲系統。其邏輯容量由內存容量和外存容量之和所決定,其運行速度接近內存速度。

理論依據--->時間局部性:如果程序某條指令被指向,則不久以後該指令會再次執行;如果某數據被訪問,則不久可能會被再次訪問。原因:程序中存在大量循環操作空間侷限性:一旦訪問了某個存儲單元,不久後,其附近的存儲單元也將被訪問,由於程序一般是順序執行。     

     實現方法:有兩種  分頁請求系統   請求分段系統-------重點

     虛擬存儲器的特徵: 多次性、對換性、虛擬性

     頁面置換算法:最佳置換算法、先進先出頁面置換算法、LRU置換算法、clock置換算法、

4:存儲器管理

存儲層次至少應具有三級:CPU寄存器、主存(高速緩存,主存,磁盤緩存)、輔存。

用戶源程序到內存中可執行程序分兩步編譯(將用戶源代碼編譯成若干個目標模塊),鏈接(將目標模塊以及所需要的庫函數鏈接,形成完整裝入模塊),裝入(完整模塊裝入內存)

     程序裝入方式:絕對裝入、可重定位裝入、動態運行時裝入

     程序鏈接方式:靜態鏈接、裝入時動態鏈接、運行時動態鏈接

     連續分配方式:單一連續分配、固定分區分配、動態分區分配、動態重定位分區分配

內存管理方式:基本分頁存儲管理方式、基本分段存儲管理方式、段頁式存儲管理方式

5:文件管理

6:OSI七層協議,網絡層有哪些協議,TCP/Ip協議

7:已知有大量字符串,找出可以唯一標識每個字符串的前綴

例如:字符串爲:abe、adef、aeg、ebg,那麼它們的唯一標識前綴分別爲:ab、ad、ae、e;

方法一:按照字符順序排序,通過與其前後字符串比較計算其唯一標識前綴;

方法二:建立trie樹

8:static virtual 類大小問題

[cpp] view plaincopyprint?

  1. class A  
  2. {  
  3. int a;  
  4. static int b;  
  5. virtual void f();  
  6. static void g();  
  7. void h();  
  8. };  

計算sizeof(A)=8

9:未排序的兩個數組合併成一個數組。

求更高效方法

方法一:將兩數排序,用二路歸併進行處理

方法二:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章