面試集錦--09網易校園招聘筆試題

第一部分(必做): 計算機科學基礎
1. (單選)軟件設計中模塊劃分應該遵循的準則是:
A.低內聚低耦合 B.高內聚低耦合 C.低內聚高耦合 D.高內聚高耦合

答案:B
高內聚低耦合,是軟件工程中的概念,是判斷設計好壞的標準,主要是面向對象的設計,主要是看類的內聚性是否高,耦合度是否低。
高內聚  內聚就是一個模塊內各個元素彼此結合的緊密程度,高內聚就是一個模塊內各個元素彼此結合的緊密程度高。   所謂高內聚是指一個軟件模塊是由相關性很強的代碼組成,只負責一項任務,也就是常說的單一責任原則。
低耦合:一個軟件結構內不同模塊之間互連程度的度量(耦合性也叫塊間聯繫。指軟件系統結構中各模塊間相互聯繫緊密程度的一種度量。模塊之間聯繫越緊密,其耦合性就越強,模塊的獨立性則越差,模塊間耦合的高低取決於模塊間接口的複雜性,調用的方式以及傳遞的信息。) 對於低耦合,粗淺的理解是:   一個完整的系統,模塊與模塊之間,儘可能的使其獨立存在。   也就是說,讓每個模塊,儘可能的獨立完成某個特定的子功能。   模塊與模塊之間的接口,儘量的少而簡單。   如果某兩個模塊間的關係比較複雜的話,最好首先考慮進一步的模塊劃分。   這樣有利於修改和組合。


2. (單選)最壞情況下時間複雜度不是n(n-1)/2的排序算法是:
A.快速排序 B.冒泡排序 C.直接插入排序 D.堆排序


 

答案:D
堆排序的最壞時間複雜度與最好時間複雜度都是O(nlog(n))。快速排序的最壞運行時間是O(n^2),期望運行時間複雜度是O(nlg(n))。冒泡排序的時間複雜度是O(n^2),直接插入排序的最壞與平均時間複雜度都是O(n^2)。


3. 哈希表中解決衝突的方法通常可以分爲open addressing和chaining兩類, 請分別解釋這兩類衝突解決方法的大致實現原理


 

答案:開放尋址法:在開放尋執法中所有元素都放在散列表中,當藥插入一個元素時,可以連續的檢測散列表的各項,直到找到一個空槽爲止。
開放尋址法常用的探查序列方法有三種:1,線性探查,2、二次探查,3、雙重探查。
線性探查:給定一個三列函數F(n),給定關鍵字k,查找散列表中的T(F(k)),如果該槽爲空則插入,如果不爲空則探查T(F(k)+1)槽,直到找到空槽爲止,如果探查到列表的尾部還沒找到空位,則從散列表的T(0)開始查找。
二次探查:散列函數爲h(k,i)=(h'(k)+c1*i+c1*i^2).初始探查位置爲T(h(k)),如果該槽不爲空則在此基礎上加上一個便宜量。該偏移量依賴於i的二次方形式。
雙重探查:開放尋址法中最好的一個尋址方法。產生的排列較隨機。散列函數形式爲
h(k)=(h1(k)+i*h2(k))mod m
鏈接法散列是在每一個槽中放置一個鏈表指針,映射到某一個槽中的元素按照一定的次序插入鏈表指針指向的鏈表中。


4. 簡單的鏈表結構擁有很好的插入 刪除節點性能, 但隨機定位(獲取鏈表第n個節點)操作性能不佳, 請你設計一種改進型的鏈表結構優化隨機定位操作的性能, 給出設計思路及其改進後隨機定位操作的時間複雜度

 

我能想到的最優解決方案是將鏈表改爲雙向循環鏈表。並在鏈表頭中增加一個鏈表長度數據域。該域記錄了鏈表的長度。如果要找的第n個節點小於鏈表長度的一半,則正向查找,否則逆向查找。時間複雜度是O(n/2)


5. 什麼是NP問題?列舉典型的NP問題(至少兩個)?對於一個給定的問題你通常如何判斷它是否爲NP問題?


 

P問題是可以在多項式時間內被確定機(通常意義的計算機)解決的問題.NP(Non-Deterministic Polynomial, 非確定多項式)問題,是指可以在多項式時間內被非確定機(它可以猜,他總是能猜到最能滿足你需要的那種選擇,如果你讓他解決n皇后問題,他只要猜n次就能完成----每次都是那麼幸運)解決的問題.它是說P問題是否等於NP問題,也即是否所有在非確定機上多項式可解的問題都能在確定機上用多項式時間求解. 換句話說NP問題不能再確定機上在多項式時間內解決。
較爲著名的NP難問題1、歐幾里得旅行商問題(非雙調)。用最少的耗費走完所有節點,且要形成迴路,每個節點只走一次。
背袋問題:貨物n個,有各自重量,兩個包,如何分貨物,使兩個包重量之差最小。我們可以通過判定與規約的方法判斷一個問題是否是NP難。簡單地,熟記常見的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

答:A


 

第二部分(選作): 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;
};


 

本題考查的是類的內存對齊。
輸出結果爲sizeof(A)=8,sizeof(B)=8,sizeof(12).詳細請參考:


類的內存對齊(類的sizeof)

2. 請用C++實現以下print函數,打印鏈表I中的所有元素, 每個元素單獨成一行
void print(const std::list<int> &I){
}


 

#include<iostream>
#include<list>
using namespace std;
void Print(const list<int>&L)
{
	list<int>::const_iterator it;
	for(it=L.begin();it!=L.end();it++)
	{
		cout<<*it<<endl;
	}
}
int main()
{
	list<int>L(10,42);
	Print(L);
	return 0;
}


3. 假設某C工程包含a.c和b.c兩個文件,在a.c中定義了一個全局變量foo, 在b.c中想訪問這一變量時該怎麼做?


 

在b.c中extern  (類型)foo;


4. C++中的new操作符通常完成兩個工作, 分配內存及其調用相應的構造函數初始化
請問:
1) 如何讓new操作符不分配內存, 只調用構造函數?
2) 這樣的用法有什麼用?

classname *f=new((void*)10)classname();
作用是:將對象放置在內存的特殊位置,是在已有的內存塊上面創建對象。
用於需要反覆創建並刪除的對象上,可以降低分配釋放內存的性能消耗


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;
}

語法錯誤!對象B不能實例化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(), 爲什麼?

當你打算實現一個多線程(非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">&nbsp;</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服務器和應用服務器之間建立反向代理
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){
//你的實現寫在這裏
}

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