盛大游戲2011.10.22校招筆試題+答案解析


1、下列代碼的輸出為:

  1. #include "iostream" 
  2. #include "vector" 
  3. using namespace std; 
  4.   
  5. int main(void) 
  6.     vector<int>array; 
  7.     array.push_back(100); 
  8.     array.push_back(300); 
  9.     array.push_back(300); 
  10.     array.push_back(500); 
  11.     vector<int>::iterator itor; 
  12.     for(itor=array.begin();itor!=array.end();itor++) 
  13.     { 
  14.         if(*itor==300) 
  15.         { 
  16.              itor = array.erase(itor); 
  17.          } 
  18.      } 
  19.      for(itor=array.begin();itor!=array.end();itor++) 
  20.     { 
  21.        cout<<*itor<<" "; 
  22.     } 
  23.     return 0; 

A、100   300   300   500    B、100    300     500    C、100    500    D、程序錯誤

 

2、下列代碼的輸出為:

  1. class CParent 
  2. public: 
  3.     virtual void Intro() 
  4.     { 
  5.         printf("I'm a Parent, "); 
  6.         Hobby(); 
  7.     } 
  8.     virtual void Hobby() 
  9.   printf("I like football!"); 
  10. }; 
  11. class CChild:public CParent 
  12.  { 
  13. public:
  14.     virtual void Intro()
  15.     { 
  16.         printf("I'm a Child, "); 
  17.         Hobby(); 
  18.     } 
  19.    virtual void Hobby() 
  20.    { 
  21.       printf("I like basketball!\n"); 
  22.    } 
  23. }; 
  24. int main(void) 
  25.   CChild *pChild = new CChild(); 
  26.   CParent *pParent = (CParent*)pChild; 
  27.   pParent->Intro(); 、
  28.   return 0; 

A、I'm a Child,I like football!                            B、I'm a Child,I like basketball! 

C、I'm a Parent,I like football!                         D、I'm a Parent,I like basketball!

 

3、在win32平台下,以下哪種方式無法實現進程同步?

A、Critical Section      B、Event      C、Mutex         D、Semaphore

 

4、按照升序排列的一組數據123456798,下面哪種排序法在空間和時間上最優?
A、快速排序             B、冒泡排序             C、插入排序             D、堆排序

 

5、以下哪句的說法是正確的
A、在頁式存儲管理中,用戶應將自己的程序划分為若干個相等的頁
B、所有的進程都掛起時,系統將陷入死鎖
C、執行系統調用可以被中斷
D、進程優先數是進程調度的重要依據,必須根據進程運行情況動態改變

 

6、以下描述正確的是
A、虛函數是可以內聯的,可以減少函數調用的開銷提高效率
B、類里面可以同時存在函數名和參數都一樣的虛函數和靜態函數
C、父類的析構函數是非虛的,但是子類的析構函數是虛的,delete子類對象指針會調用父類的析構函數
D、以上都不對

 

7、5+55+555+...+555..5(55個5)所得之和的末四位數是多少
A、9435             B、9445            C、9475               D、9485

 

8、5+55+555+...+555..5(12個5)所得之和的末三位數是多少

 

9、7+77+777+...+777..7(2005個7)所得之和的末四位數是多少

 

簡答題:快速排序的思想是遞歸的,但是它的平均效率卻是眾多排序算法中最快的,為什么?請結合本例說明你對遞歸程序的理解。

 

 

 

 

算法題:用你熟悉的編程語言,設計如下功能的函數:輸入一個字符串,輸出該字符串中所有字母的全排列。程序請適當添加注釋。
C++函數原型: void Print(const char *str)
輸入樣例: abc
輸出結果: abc、acb、bca、bac、cab、cba

 

參考答案(歡迎討論) 轉載請注明來源 http://www.cnblogs.com/jerry19880126/

  1. B。erase刪除迭代器后,會返回指向下一個元素的迭代器(本質是刪除后,后面的元素左移了),但注意for循環中又更新了迭代器itor++,所以第二個300被跳掉了,結果是B而不是C。
  2. B。多態,調用的是子類的虛函數。
  3. A。A不能跨進程使用,C一次允許一個進程訪問共享內存,D一次允許多個進程訪問共享內存。
  4. C。已經基本有序,快排很容易遇到主元選擇不當的問題,堆排序也沒有必要了(堆排序的優點在於對輸入次序不敏感,因此不能有效利用數列的基本有序性質)。B和C之間選擇其實還要三思,插入排序和冒泡排序都是原地排序,所以空間復雜度一樣。時間復雜度兩者都是兩層循環,插入排序在遍歷第二個元素至最后一個元素時,比較次數為N-1+1,+1是因為訪問8的時候,前面的9和7都要比較;冒泡排序從遍歷第一個元素至第endIndex的元素,endIndex是變化的,第一次外循環的時候endIndex為倒數第二個元素,第二次外循環的時候endIndex為倒數第三個元素。第一次外循環時,比較次數為N-1次,第二次外循環時,比較次數是N-2次,第二次無元素變化,所以可以結束排序,總的比較次數是2N-3。這樣看來,還是插入排序為優。
  5. C。只要開啟使能位,是可以中斷系統調用的。
  6. C。虛函數不能是內聯函數(編譯時展開,必須有實體),不能是靜態函數(屬於自身類,不屬於對象,而虛函數要求有實體),不能是構造函數(尚未建立虛函數表)。虛函數只在繼承的概念下有意義。
  7. C。54*5+(55*5)的進位=297,所以倒數第二位是7,進位為29。
  8. 610。算法同7。
  9. 0415。算法同7。

 

簡答題:

原因:

(1)內循環是與固定值進行比較的,不會對數據進行連續的搬移。

(2)比較次數少,而且對於隨機數組而言,很少出現主元選擇不當而降低效率的問題。

遞歸程序的理解:

理想情況下復雜度為T(n)=O(n)+T(n/2)=O(nlogn),遞歸就是將原先復雜度為n的算法,逐步減少操作數量(由T(n)降至T(n/2)),運用分治思想將復雜問題一次一次折半地簡化,達到最終以對數復雜度解決問題的目的。

注意快排只是平均和最好情況下的復雜度為O(nlogn),它最壞的復雜度是O(n^2),當然,只要輸入數組是隨機的,出現O(n^2)復雜度的概率好比“你家的電腦被閃電擊中了”。

 

算法題:

全排列之前有百度的筆試題出現過,但這里有些變化,注意到參數是const的,也就是不能直接在Print中操作(因為需要交換位置),解決方法是重新定義一個輔助函數,用拷貝后的數組變化作為參數傳入,詳見CPP代碼。

全排列
 1 #include <iostream>
 2 using namespace std;
 3 
 4 static int count = 0;
 5 
 6 void permut(char* a, int start, int end)
 7 {
 8     if(start >= end)
 9     {
10         ++count;
11         cout << a << endl;
12     }
13     else
14     {
15         for(int i = start; i <= end; ++i)
16         {
17             swap(a[i], a[start]);
18             permut(a, start + 1, end);
19             swap(a[i], a[start]);
20         }
21     }
22 }
23 
24 
25 void Print(const char* str)
26 {
27     int len = strlen(str);
28     char *p = new char[len + 1];
29     strncpy(p, str, len);
30     p[len] = '\0';
31     permut(p, 0, len - 1);
32     delete [] p;
33 }
34 
35 int main()
36 {
37     int a[0...10];
38     Print("abcd");
39     cout << endl << "總共有 " << count << "" << endl;
40     return 0;
41 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM