A卷(研發類筆試題)
第一部分(必做): 電腦科學基礎
1. (單選)軟體設計中模組劃分應該遵循的準則是:
A.低內聚低耦合 B.高內聚低耦合 C.低內聚高耦合 D.高內聚高耦合
2. (單選)最壞情況下時間複雜度不是n(n-1)/2的排序演算法是:
A.快速排序 B.冒泡排序 C.直接插入排序 D.堆排序
3. 雜湊表中解決衝突的方法通常可以分為open addressing和chaining兩類, 請分別解釋這兩類衝突解決方案的大致實現原理
4. 簡單的鏈表結構擁有很好的插入 刪除節點效能, 但隨機定位(擷取鏈表第n個節點)操作效能不佳, 請你設計一種改進型的鏈表結構最佳化隨機定位操作的效能, 給出設計思路及其改進後隨機定位操作的時間複雜度
5. 什麼是NP問題?列舉典型的NP問題(至少兩個)?對於一個給定的問題你通常如何判斷它是否為NP問題?
6. 以下是一個tree的遍曆演算法, queue是FIFO隊列, 請參考下面的tree, 選擇正確的輸出.
1
/ \
2 3
/ \ / \
4 5 6 7
queue.push(tree.root)
while(true){
node=queue.pop();
output(node.value);//輸出節點對應數字
if(null==node)
break;
for(child_node in node.children){
queue.push(child_node);
}
}
A. 1234567
B. 1245367
C. 1376254
D. 1327654
第二部分(選作): C/C++程式設計
1. 有三個類A B C定義如下, 請確定sizeof(A) sizeof(B) sizeof(C)的大小順序, 並給出理由
struct A{
A() {}
~A() {}
int m1;
int m2;
};
struct B{
B() {}
~B() {}
int m1;
char m2;
static char m3;
};
struct C{
C() {}
virtual~C() {}
int m1;
short m2;
};
2. 請用C++實現以下print函數,列印鏈表I中的所有元素, 每個元素單獨成一行
void print(const std::list<int> &I){
}
3. 假設某C工程包含a.c和b.c兩個檔案,在a.c中定義了一個全域變數foo, 在b.c中想訪問這一變數時該怎麼做?
4. C++中的new操作符通常完成兩個工作, 分配記憶體及其調用相應的建構函式初始化
請問:
1) 如何讓new操作符不分配記憶體, 只調用建構函式?
2) 這樣的用法有什麼用?
5. 下面這段程式的輸出是什麼?為什麼?
class A{
public:
A(){p();}
virtual void p(){print("A")}
virtual ~A(){p();}
};
class B{
public:
B(){p();}
void p(){print("B")}
~B(){p();}
};
int main(int, char**){
A* a=new B();
delete a;
}
6. 什麼是C++ Traits? 並舉例說明
第三部分(選作): JAVA程式設計
1. (單選)以下Java程式啟動並執行結構是:
public class Tester{
public static void main(String[] args){
Integer var1=new Integer(1);
Integer var2=var1;
doSomething(var2);
System.out.print(var1.intValue());
System.out.print(var1==var2);
}
public static void doSomething(Integer integer){
integer=new Integer(2);
}
}
A. 1true
B. 2true
C. 1false
D. 2false
2. (單選)往OuterClass類的程式碼片段中插入內部類聲明, 哪一個是正確的:
public class OuterClass{
private float f=1.0f;
//插入代碼到這裡
}
A.
class InnerClass{
public static float func(){return f;}
}
B.
abstract class InnerClass{
public abstract float func(){}
}
C.
static class InnerClass{
protected static float func(){return f;}
}
D.
public class InnerClass{
static static float func(){return f;}
}
3. Java中的interface有什麼作用? 舉例說明哪些情況適合用interface, 哪些情況下適合用抽象類別.
4. Java多線程有哪幾種實現方式? Java中的類如何保證安全執行緒? 請說明ThreadLocal的用法和適用情境
5. 安全執行緒的Map在JDK 1.5及其更高版本環境 有哪幾種方法可以實現?
6.
1) 簡述Java ClassLoader的模型, 說明其層次關係及其類載入的主要流程即可.
2) TypeA.class位於classpath下, /absolute_path/TypeA.class為其在檔案系統中的絕對路徑, 且類檔案小於1k, MyClassLoader為一個自訂的類載入器, 下面的這段類載入程式是否正確, 如果有錯請指出哪一行有錯, 簡述理由
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class Tester{
public static void main(String[] args){
MyClassLoader cl1=new MyClassLoader();
try{
File f=new File("/absolute_path/TypeA.class");
byte[] b=new byte[1024];
InputStream is=new FileInputStream(f);
int I=is.read(b);
Class c=cl1.defineMyClass(null,b,0,1);
TypeA a=(TypeA)c.newInstance();
}catch(Exception e){
e.printStacktrace();
}
}
}
第四部分(選作): Linux應用與開發
1. 寫出完成以下功能的Linux命令:
1) 在目前的目錄及其子目錄所有的.cpp檔案中尋找字串"example", 不區分大小寫;
2) 使用sed命令, 將檔案xyz中的單詞AAA全部替換為BBB;
3) 用一條命令建立aa bb cc三個子目錄
4) mount cdrom.iso至/dev/cdrom目錄
5) 設定ulimit使得程式在Segment fault等嚴重錯誤時可以產生coredump;
2. 設umask為002, 則建立立的檔案的許可權是什麼?
A. -rw-rwr--
B. rwxrwx-w-
C. -------w-
D. rwxrwxr-x
3. 使用者HOME目錄下的.bashrc和.bash_profile檔案的功能有什麼區別?
4. 寫出完成以下功能的gdb命令(可以使用命令簡寫形式):
1) 使用gdb偵錯工具foo, 使用coredump檔案core.12023;
2) 查看線程資訊
3) 查看呼叫堆疊
4) 在類ClassFoo的函數foo上設定一個斷點
5) 設定一個斷點, 當運算式expr的值被改變時觸發
5.
1) 例舉Linux下多線程編程常用的pthread庫提供的函數名並給出簡要說明(至少給出5個)
2) pthread庫提供哪兩種線程同步機制, 列出主要API
3) 使用pthread庫的多線程程式編譯時間需要加什麼串連參數?
第五部分(選作): Windows開發
1. DC(裝置上下文)有哪幾類? 區別在哪裡?
2. 碰撞檢測是遊戲中經常要用到的基本技術 對於二維情況, 請回答以下問題:
1). 如何判斷一個點在一個多邊形內
2). 如何判斷兩個多邊形相交
3). 如何判斷兩個點集所形成的完全圖所圍的地區是否相交
3. PostMessage SendMessage和PostThreadMessage的區別是什麼
4. 什麼叫Alpha混合? 當前流行的圖片格式中哪些支援alpha通道? Layered Window和普通Window有什麼區別?
5. 如果要實現一個多線程(非MFC)程式, 選擇多線程CRT, 建立線程的時候應該用CreateThread還是_beginthreadex(), 為什麼?
為何要用_beginthreadex()而非CreateThread?
當你打算實現一個多線程(非MFC)程式,你會選擇一個單線程的CRT(C執行階段程式庫)嗎?如果你的回答是NO, 那麼會帶來另外一個問題,你選擇了CreateThread來建立一個線程嗎? 大多數人也許會立刻回答YES。可是很不幸,這是錯誤的選擇。
我先來說一下我的結論,待會告訴你為什麼。
如果要作多線程(非MFC)程式,在主線程以外的任何線程內
- 使用malloc(),free(),new
- 調用stdio.h或io.h,包括fopen(),open(),getchar(),write(),printf(),errno
- 使用浮點變數和浮點運算函數
- 調用那些使用靜態緩衝區的函數如: asctime(),strtok(),rand()等。
你就應該使用多線程的CRT並配合_beginthreadex(該函數只存在於多線程CRT), 其他情況下你可以使用單線程的CRT並配合CreateThread。
因為對產生的線程而言,_beginthreadex比之CreateThread會為上述操作多做額外的簿記工作,比如協助strtok()為每個線程準備一份緩衝區。
然而多線程程式極少情況不使用上述那些函數(比如記憶體配置或者io),所以與其每次都要思考是要使用_beginthreadex還是CreateThread,不如就一棍子敲定_beginthreadex。
當然你也許會藉助win32來處理記憶體配置和Io,這時候你確實可以以單線程crt配合CreateThread,因為io的重任已經從crt轉交 給了win32。這時通常你應該使用HeapAlloc,HeapFree來處理記憶體配置,用CreateFile或者GetStdHandle來處理 Io。
還有一點比較重要的是_beginthreadex傳回的雖然是個unsigned long,其實是個線程Handle(事實上_beginthreadex在內部就是調用了CreateThread),所以你應該用 CloseHandle來結束他。千萬不要使用ExitThread()來退出_beginthreadex建立的線程,那樣會喪失釋放簿記資料的機會, 應該使用_endthreadex.
第六部分(選作): 資料庫開發
1. 基於雜湊的索引和基於樹的索引有什麼區別?
2. User表用於記錄使用者相關資訊, Photo表用於記錄使用者的照片資訊, 兩個表的定義如下:
CREATE TABLE User( --使用者資訊表
UserId bigint, --使用者唯一id
Account varchar(30) --使用者唯一帳號
);
CREATE TABLE Photo( --照片資訊表
PhotoId bigint, --照片唯一id
UserId bigint, --照片所屬使用者id
AccessCount int, --訪問次數
Size bigint --照片檔案實際大小
)
1) 請給出SQL列印帳號為"dragon"的使用者訪問次數最多的5張照片的id;
2) 給出SQL列印擁有總的照片檔案大小(total_size)最多的前10名使用者的id, 並根據total_size降序排列
3) 為最佳化上面兩個查詢, 需要在User和Photo表上建立什麼樣的索引?
4) 簡述索引對資料庫效能的影響?
3. 什麼是兩階段交易認可協議?
4. 資料庫事務基本概念:
1) 什麼是事務的ACID性質?
2) SQL標準中定義的交易隔離等級有哪四個?
3) 資料庫中最常用的是哪兩種並發控制協議?
4) 列舉你所知的資料庫管理系統中採用的並發控制協議
5. 資料庫中有表User(id, name, age):
表中資料可能會是以下形式:
id name age
001 張三 56
002 李四 25
003 王五 56
004 趙六 21
005 錢七 39
006 孫八 56
..............
由於人員年齡有可能相等, 請寫出SQL語句, 用於查詢age最大的人員中, id最小的一個記錄
6. 並發訪問資料庫時常使用串連池, 請問使用串連池的好處是什麼? 對於有多台應用伺服器並發訪問一台中樞資料庫的情況, 資料庫訪問往往成為系統瓶頸, 請問在應用伺服器上設計和使用串連池時該注意哪些問題, 以保證系統的可靠性 正確性和整體效能. 假設每台應用伺服器都執行相同的任務並且負載平衡.
第七部分(選作): Web開發
1. 以下哪一條Javascript語句會產生運行錯誤:
A. var obj=( );
B. var obj=[ ];
C. var obj={ };
D. var obj=/ /;
2. 如下頁面代碼(範例程式碼DOCTYPE為Strict)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh" lang="zh">
<head>
<title>測試</title>
<meta http-equiv="content-type" content="text/html; charset=gbk" />
<meta http-equiv="content-style-type" content="text/cee" />
<meta http-equiv="content-script-type" content="text/javascript" />
<script type="text/css">
*{margin:0; padding:0}
html{width:100%; height:100%;
overflow:scroll; overflow-x:auto;
text-align:center; border:0}
.test{height:200px}
</script>
</head>
<body>
<div class="text"> </div>
</body>
</html>
假設a.jpg圖片的規格是200pxX100px, 請給出當前背景圖片距div.a頂部距離的計算方式和結果(css)
3. HTTP協議相關知識
A) 常見的HTTP Request頭欄位有哪些?
B) web伺服器如何區分訪問者是普通瀏覽使用者還是搜尋引擎的Spider?
C) cookie按生命週期分類分為哪兩類? 其生命週期分別是多長? 向瀏覽器設定cookie時cookie有哪些屬性可以設定, 分別起到什麼作用?
D) HTTP協議中Keep-Alive是什麼意思? 使用Keep-Alive有何好處, 對伺服器會有什麼不利的影響? 對於不利的影響有什麼解決方案
4. 簡述你最常用的Web伺服器的一種或者幾種, 並說明如何在Web伺服器和應用伺服器之間建立反向 Proxy
5. 簡述你所瞭解的MVC各層次的常用開發架構, 說明其特點
6. 簡述Web應用環境下遠程調用的幾種方式, 並且從效能 異構性等方面比較其優劣
第八部分(選作): Flash開發
7. flash和js如何互動?
8. flash中的事件處理分哪幾個過程 Event對象的target和currentTarget有什麼區別?
第九部分(選作): 軟體測試
1. 請描述你對測試的瞭解, 內容可以涉及測試流程, 測試類型, 測試方法, 測試載入器等
2. 如果有一天你早上上班, 發現不能上網了, 你會用什麼步驟找出問題所在?
3. Web應用中實現了好友功能, 使用者可以給別人發"加為好友"的請求, 發了請求後可以取消請求, 對方收到請求後, 可以選擇接受或者拒絕. 互為好友的兩個人, 每個人都可以單方面刪除對方, 請設想儘可能多的路徑對此功能設計測試案例, 每個用例包括測試步驟和預期結果
4. 公司開發了一個web聊天工具, 用於網路使用者之間的聊天, 一個人同時可以和多個人聊天, 功能類似於MSN等等IM工具
要求該系統能承受1萬個線上使用者, 平均每個使用者會和3個人同時聊天, 在網路條件正常的情況下, 要求使用者收到訊息的延遲時間不超過1分鐘. 現在需要對系統進行效能測試, 驗證系統是否達到預定要求, 請你寫一個效能測試方案. 提示如下:
1) 效能測試的過程一般都是類比大量用戶端操作, 同時監控伺服器的效能和用戶端相應, 根據伺服器的效能指標和用戶端響應狀況進行分析和判斷
2) 系統的效能問題可以從兩個角度考慮, 一個是伺服器問題, 設計得不好的程式, 在大負載或者長時間運行情況下, 伺服器會down機; 另一個是用戶端問題, 在負載大的時候, 用戶端響應會變慢
3) 在答題中, 可以不涉及效能測試工具, 監控工具等細節, 把你的測試思路說清楚就可以
5. 自動功能測試中會將測試案例組織成測試集合來統一運行, 測試集合suite按功能分類可以有若干個模組module, 每個模組module下包含若干個測試案例test. 現測試集合已經運行完畢, 但是需要在測試報告中統計各個模組的用例失敗率, 將失敗率超過20%的模組名與其失敗率記錄下來警示, 請編寫實現上述功能的getTestReport函數. 可使用Java或C++等您熟悉的程式設計語言, 提供的介面及方法如下:
測試集合介面Isuite:
Collection<ITest>getTests() //得到測試集合下的所有測試案例test
測試案例介面Itest:
String getModule() //得到該用例對應的模組名稱module
int getResult() //得到該用例的執行結果:0失敗 1成功
警示函數:
void alertMessage(String message)
public static void getTestReport(ISuite suite){
//你的實現寫在這裡
}