一、選擇題:15分 共10題
1. 已知一個線性表(38,25,74,63,52,48),採用的散列函數爲Hash($Key)=$Key mod 7,將元素散列到表長爲7的哈希表中存儲。請選擇後面兩種衝突解決方法分別應用在該散列表上進行等概率成功查找的平均查找長度,拉鍊法 ,線性探測法 .
A. 1.0 B. 1.5 C. 1.7 D. 2.0 E. 2.3
F. 7/6 G. 4/3 H. 3/2
2. 需要將OS緩衝區的數據刷新到硬盤,可以調用的函數有(多選):
A.fflush() B. fsync() C. sync() D.writev()
3. 下面哪個shell語句不能打印出用戶主目錄的路徑?
A. echo “$HOME” B. echo ~
C. echo `$HOME` D. echo $HOME
4. 最壞情況下,合併兩個大小爲n的已排序數組所需要的比較次數
A.2n B.2n-1 C.2n+1 D.2n-2
5. 一個B類網的子網掩碼是255.255.240.0,這個子網能擁有的最大主機數是:
A. 240 B. 255 C.4094 D. 65534
6. 以下代碼執行後,val的值是___:
unsigned long val = 0;
char a = 0x48;
char b = 0x52;
val = b << 8 | a;
A 20992 B 21064 C 72 D 0
7. 內存的速度遠遠高於磁盤速度,所以爲了解決這個矛盾,可以採用:
A 並行技術 B 虛存技術 C 緩衝技術 D 通道技術
8. 以下代碼打印的結果是(假設運行在i386系列計算機上):
struct st_t
{
int status;
short* pdata;
char errstr[32];
};
st_t st[16];
char* p = (char*)(st[2].errstr + 32);
printf("%d", (p - (char*)(st)));
A 32 B 114
C 120 D 1112
9. 同一進程下的線程可以共享以下
A. stack B. data section
C. register set D. thread ID
10. 以下哪種操作最適合先進行排序處理?
A 找最大、最小值 B 計算算術平均值
C 找中間值 D 找出現次數最多的值
二、簡答題:20分,共2題
1. (6分)下面是一個http請求:
GET /baidu/blog/item/6605d1b4eb6433738ad4b26d.html HTTP/1.1
Host: hi.baidu.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://hi.baidu.com/baidu
Cookie: BAIDUID=AFB70E986AC48B336ABAB7505CDD1C76;
請解釋以下各字段基本含義: Host、User-Agent、Accept-Charset、Connection、Referer、Cookie
2. (14分)函數A將字符串str1轉成小寫,並打印出轉化前後的字符串。另外,改錯時不能改變函數的接口和主要思路。改錯時,請指出行號。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4
5 char* str1 = "ABDFLjlero我們都是saf";
6
7 char* ToLower(char s[])
8 {
9 static size_t i=sizeof(s);
10
11 for (i; i>=0; i--) {
12 if (s[i]>"A" && s[i]<"Z") {
13 s[i] += 26;
14 }
15 }
16 return s;
17 }
18
19 int A()
20 {
21 printf("old str[%s] after lower[%s]n", str1, ToLower(str1));
22 }
三、編程題:30分 共1題
注意:要求提供完整代碼,如果可以編譯運行酌情加分。
1. 兩個已排序的整型數組,求交集,最快算法
輸入:兩個已排序的整型數組(int a[m], b[n])
輸出:兩個數組的交集
四、設計題:35分 共1題
注意:請儘可能詳細描述你的數據結構、系統架構、設計思路等。建議多寫一些僞代碼或者流程說明。
1. 考慮一個字符串替換的過程,在一個文本文件中含有一些文本內容和一些需要替換的變量,變量的格式爲“$Var$”,原來的“$”使用“$$”進行轉義,原來的“$$”表示爲“$$$”。我們將含有變量的文件稱爲模板(文件名爲t),文本文件的平均長度爲100K。另外,還有一系列的變量文件,裏面爲變量名和變量值的對應關係(文件名爲1.v , 2.v… n.v),每個變量文件包含的變量數在百萬數量級,且變量排列次序不定。現要求將,模板裏的變量分別用變量文件裏的變量替換,並將生成的文件寫成(1.r, 2.r… n.r)。
要求:從算法和實現上和實現技術上的細節對程序進行優化,儘量使程序高效。程序運行環境爲2G內存,4CPU。闡明主要思路,給出僞碼和說明,可以着重指出你使用的優化技術。
例子:模板文件爲
This is an $FF$ $$. I like $FF$ and $FA$。
變量文件爲
1.v
FF : banana
FA : apple
2.v
FA: 蘋果
FF : 香蕉
則生成文件爲
1.r
This is an banana $$. I like banana and apple。
2.r
This is an香蕉 $$. I like 香蕉and蘋果。
一、選擇題
1.BD
2.ABC
3.A
4.B
5.C
6.B
7.CD
8.C
9.B
10.C
二、簡答題
1.
Host:請求報頭域主要用於指定被請求資源的Internet主機和端口號
User-Agent:請求報頭域允許客戶端將它的操作系統、瀏覽器和其它屬性告訴服務器
Accept-Charset:請求報頭域用於指定客戶端接受的字符集
Connection:普通報頭域允許發送指定連接的選項
Referer:訪問來源鏈接
Cookie:在客戶的計算機上的以小文本文件存儲信息
2.
5:由於str1指向的是常量,不允許修改,所以在此要修改爲char str1[]="ABDFLjlero我們都是saf";
9:size_t i=strlen(s);
12:改爲if (s[i]>='A' && s[i]<='Z'){
13:改爲s[i] += 32;
三、編程題
1.
#include <stdio.h>
void GetIntersection(int a[], int m, int b[], int n)
{
int i = 0;
int j = 0;
while(i < m)
{
while(j < n)
{
if(a[i] == b[j])
{
//交集
printf("%d ",a[i]);
j++;
break;
}
else if(a[i] < b[j])
{
//從a的下一項開始匹配
break;
}
else
{
//比較b的下一項
j++;
}
}
i++;
}
}
int main(void)
{
int a[]={1,2,3,4,5};
int b[]={3,4,5,6};
GetIntersection(a,5,b,4);
return 0;
}
四、設計題
設計思路:
利用哈希表,正則表達式
數據結構:
可以採用stl中的map來存儲變量名和變量值
設計結構體來保存變量文件與該map的對應關係
typedef struct _VarFile
{
char *pFileName;
map<string,string>[] varMapping;
}VarFile;
流程說明:
1.首先讀取模板文件(t)中的需要替換的變量,用正則表達式去匹配出現的需替換的變量。將它們保存到list(lstNeed)中。
2.定義一個VarFile的結構體數組(設名稱爲vf),讀取變量文件,把變量文件名與該文件下的變量對應關係保存到該數組中。
3.遍歷上述數組(vf),針對lstNeed中的元素,設計合適的哈希函數,進行替換,然後寫入文件。
僞碼:
open(t);
add 需替換的變量 to lstNeed
for i=1:n
open (i.v)
add i.v & 變量名和變量值 to vf
end for
遍歷vf
design hash function and then replace.
優化思路:
不必一次把所有的內容讀入內存,可以採用緩存機制,分批讀入,然後分批寫入文件。