1、下面的排序算法中,初始數據集的排列順序對算法的性能無影響的是()
A、插入排序 B、堆排序 C、冒泡排序 D、快速排序
2、以下關於Cache的敘述中,正確的是()
A、CPU中的Cache容量應大於CPU之外的Cache容量
B、Cache的設計思想是在合理成本下提高命中率
C、Cache的設計目標是容量盡可能與主存容量相等
D、在容量確定的情況下,替換算法的時間復雜度是影響Cache命中率的關鍵因素
3、數據存儲在磁盤上的排列方式會影響I/O服務的性能,一個圓環的磁道上有10個物理塊,10個數據記錄R1------R10存放在這個磁道上,記錄的安排順序如下表所示:
| 物理塊 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| 邏輯記錄 |
R1 |
R2 |
R3 |
R4 |
R5 |
R6 |
R7 |
R8 |
R9 |
R10 |
假設磁盤的旋轉速度為20ms/周,磁盤當前處在R1的開頭處,若系統順序掃描后將數據放入單緩沖區內,處理數據的時間為4ms(然后再讀取下個記錄),則處理這10個記錄的最長時間為()
A、180ms B、200ms C、204ms D、220ms
4、隨着IP網絡的發展,為了節省可分配的注冊IP地址,有一些地址被拿出來用於私有IP地址,以下不屬於私有IP地址范圍的是()
A、10.6.207.84 B、172.23.30.28 C、172.32.50.80 D、192.168.1.100
5、下列關於一個類的靜態成員的描述中,不正確的是()
A、該類的對象共享其靜態成員變量的值 B、靜態成員變量可被該類的所有方法訪問
C、該類的靜態方法只能訪問該類的靜態成員變量 D、該類的靜態數據成員變量的值不可修改
6、已知一個線性表(38,25,74,63,52,48),假定采用散列函數h(key) = key%7計算散列地址,並散列存儲在散列表A【0....6】中,若采用線性探測方法解決沖突,則在該散列表上進行等概率成功查找的平均查找長度為()
A、1.5 B、1.7 C、2.0 D、2.3
7、表達式“X=A+B*(C--D)/E”的后綴表示形式可以為()
A、XAB+CDE/-*= B、XA+BC-DE/*= C、XABCD-*E/+= D、XABCDE+*/=
8、()設計模式將抽象部分與它的實現部分相分離。
A、Singleton(單例) B、 Bridge(橋接)
C、 Composite(組合) D、 Facade(外觀)
9、下面程序的輸出結果為多少?
- void Func(char str_arg[100])
- {
- printf("%d\n",sizeof(str_arg));
- }
- int main(void)
- {
- char str[]="Hello";
- printf("%d\n",sizeof(str));
- printf("%d\n",strlen(str));
- char *p = str;
- printf("%d\n",sizeof(p));
- Func(str);
- }
10、C++將父類的析構函數定義為虛函數,下列正確的是哪個?
A、釋放父類指針時能正確釋放子類對象
B、釋放子類指針時能正確釋放父類對象
C、這樣做是錯誤的
D、以上全錯
11、下列哪一個不屬於關系數據庫的特點?
A、數據冗余度小
B、數據獨立性高
C、數據共享性好
D、多用戶訪問
12、下面程序的輸出結果為多少?
- void Func(char str_arg[2])
- {
- int m = sizeof(str_arg);
- int n = strlen(str_arg);
- printf("%d\n",m);
- printf("%d\n",n);
- }
- int main(void)
- {
- char str[]="Hello";
- Func(str);
- }
13、typedef char *String_t; 和 #define String_d char * 這兩句在使用上有什么區別?
14、到商店里買200的商品返還100優惠券(可以在本商店代替現金)。請問實際上折扣是多少?
15、題目:已知rand7() 可以產生 1~7 的7個數(均勻概率),利用rand7() 產生rand10() 1~10(均勻概率)
16、給定能隨機生成整數1到5的函數,寫出能隨機生成整數1到7的函數。
17、對一個正整數作如下操作:如果是偶數則除以2,如果是奇數則加1,如此進行直到1時操作停止,求經過9次操作變為1的數有多少個?
算法編程題:
1、給定一個字符串,求出其最長的重復子串。
參考答案(歡迎討論)轉載請注明來源http://www.cnblogs.com/jerry19880126/
- B。若序列事先已經基本有序,則插入法和冒泡法會明顯減少比較次數,快速排序法與主元的選擇有關,若一般選子序列左側第一個元素比較,則第一個元素最好是大小居中的,以使得分成的兩個子數組長度大致相等,性能才能最佳,所以快速排序也與初始輸入集有關的。堆排序受數據集輸入順序影響最小。
- B。Cache(高速緩沖器)容量小於主存,但速度快於主存,慢於CPU,相當於CPU和主存間的一個緩沖器,Cache中存放最近使用過的內存內容(基於最近使用過的內容很可能被再次使用的原理)。若CPU尋訪的內容在Cache中存放,則優先從Cache中讀取,稱為命中,否則稱為脫靶,脫靶只能從主存中讀取內容了。當Cache存儲滿的時候,用替換算法清理掉不用的內容,保留下最新或最常使用的內容,稱為替換。Cache設計目標是提高命中率。替換算法確實是影響Cache命中率,但還有Cache容量、存儲單元大小、組數多少、地址比較方法、寫操作方法等都會影響Cache命中率。
- C。這道題終於會做了。是這樣的原理,磁盤會一直朝某個方向旋轉,不會因為處理數據而停止。本題要求順序處理R1到R10,起始位置在R1,一周是20ms,共10個記錄,所以每個記錄的讀取時間為2ms。首先讀R1並處理R1,讀R1花2ms,讀好后磁盤處於R1的末尾或R2的開頭,此時處理R1,需要4ms,因為磁盤一直旋轉,所以R1處理好了后磁盤已經轉到R4的開始了,這時花的時間為2+4=6ms。這時候要處理R2,需要等待磁盤從R5一直轉到R2的開始才行,磁盤轉動不可反向,所以要經過8*2ms才能轉到R1的末尾,讀取R2需要2ms,再處理R2需要4ms,處理結束后磁盤已經轉到R5的開頭了,這時花的時間為2*8+2+4=22ms。等待磁盤再轉到R3又要8*2ms,加上R3自身2ms的讀取時間和4ms的處理時間,花的時間也為22ms,此時磁盤已經轉到R6的開頭了,寫到這里,大家已經可以看到規律了,讀取並處理后序記錄都為22ms,所以總時間為6+22*9=204ms。
- C。見實習生筆試里的解釋。
- D。靜態成員只要不是const的,每個對象都對其進行可以修改,但注意靜態成員只有一份,修改后所有對象再訪問的時候,都是最近修改后的數值了。
- C。解釋如下,先分別求這六個數的余7后的結果,分別為3,4,4,0,3,6。列出一個表格,如下所示:
| 位置 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
| 記錄 |
63 |
48 |
38 |
25 |
74 |
52 |
|
| 查找次數 |
1 |
3 |
1 |
1 |
2 |
4 |
38的余數是3,所以放在3號位置對應的記錄里,25放在位置4,74求余的結果也是4,這就出現沖突了,線性探測就是往后移一格再存,所以放在5號位置了,按照這個方法依次放置到相應的位置。查找時,比如此時查找52,余數是3,本應位於3號位置,但3號位置被38占了,所以繼續向后查找,4號位置沒有,5號位置也沒有,6號位置才查到,所以查找次數就是4次了。平均查找長度就是各數查找次數之和/6。
7. C。后綴形式,復習一下,其實不難的,注意運算優先級,”=”應是最后做的。
8. B。看看設計模式的書。
9. 6,5,4,4。第一個是求數組的大小,不要忘了’\0’,第二個是求字符串長度,注意strlen返回的長度是不包括’\0’的,指針的sizeof都是4字節(32位系統)。函數中形參雖是數組的形式,但實際傳入的是指針(數組首地址),所以后面[100]其實沒有用,還是4字節。
10. A。虛析構函數,C++多態。
11. D。
12. 4,5。同第9題解釋,函數中的[2]其實是沒有用的,因為只傳數組首地址,就是指針,所以sizeof(指針)=4(32位系統),求strlen時是遇’\0’停止計數的,且不包括’\0’,所以是5。
13. 前者聲明一個類型的別名,在編譯時處理,有類型檢查;后者是一個簡單的替換,在預編譯時處理,無類型檢查。從使用上來說,String_t a,b; a和b都是char* 類型的,但String_d a,b; 只有a是char*類型的,b是char型的。
14. 需要自己去完善條件。比如優惠券本次消費是否就可以使用,還是要等到下次消費才可用,優惠券在消費多少時才可以使用等。舉個簡單的例子,比如只能下次消費使用,且滿200才可以使用其中的50元優惠券,這樣實際折扣為(200+200-50)/400=8.9折,繼續買下去,折扣可以在8折左右。
15.如下:
1 int rand10() 2 { 3 int temp; 4 int temp2; 5 do 6 { 7 temp = rand7(); 8 } while (temp > 5);//temp 1到5 9 do 10 { 11 temp2 = rand7(); 12 while (temp2 > 2);//temp2 1到2 13 return temp + (temp2 - 1) * 5; 14 }
16. 解法同15。
17. 最后一個必是2/2=1,前一個也必是4/2=2,再往前可以自己推幾個,可以發現從9th到5th間隔內的分叉數依次是0,1,1,2,3,5,每次分叉就會多出一個可能的數,找規律可以推測是Fabbonaci數列,所以結果應該1+1+2+3+5+8+13=33,別忘了即使是0分叉也包含了自身一個數,所以最終結果是34。
18. 如下:
View Code
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 #include <vector> 5 6 using namespace std; 7 8 class LongestCommonString 9 { 10 vector<string> suffixArray; 11 size_t len; 12 public: 13 14 //構造方法 15 LongestCommonString(string s) 16 { 17 //構造后綴數組 18 for(size_t i = 0; i < s.length(); ++i) 19 { 20 suffixArray.push_back(s.substr(i)); 21 } 22 //排序 23 sort(suffixArray.begin(), suffixArray.end()); 24 len = suffixArray.size(); 25 } 26 27 //兩兩比較,返回最長長度的子串 28 string lcpCompare() 29 { 30 size_t maxLength = 0; 31 size_t index = 0; 32 for(size_t i = 0; i < len - 1; ++i) 33 { 34 size_t temp = lcp(suffixArray.at(i), suffixArray.at(i+1)); 35 if(temp > maxLength) 36 { 37 maxLength = temp; 38 index = i; 39 } 40 } 41 return suffixArray.at(index).substr(0, maxLength); 42 } 43 44 //返回重復的長度 45 size_t lcp(const string& a, const string& b) 46 { 47 size_t i = 0; 48 while(a[i] == b[i]) 49 { 50 ++i; 51 } 52 return i; 53 } 54 }; 55 56 int main() 57 { 58 string h = "hello"; 59 //cout << h.substr(2, 3); 60 string word = "aacaagmtttacaagmc"; 61 LongestCommonString slcp(word); 62 cout << "最長重復子串為:" << slcp.lcpCompare() << endl; 63 }
