劍指XX遊戲(二) - 網易2011筆試題詳解

網上弄到的一份題,不是很完整,邊猜邊做。


1.寫出運行結果

char array[] = “abcde”; char* s = array;

cout<<sizeof(array)<<strlen(array)<<sizeof(s)<<strlen(s);


6585


2.什麼是用戶級線程和內核級線程?區別。

內核級線程:
(1)線程的創建、撤銷和切換等,都需要內核直接實現,即內核瞭解每一個作爲可調度實體的線程。
(2)這些線程可以在全系統內進行資源的競爭。
(3)內核空間內爲每一個內核支持線程設置了一個線程控制塊(TCB),內核根據該控制塊,感知線程的存在,並進行控制。
在一定程度上類似於進程,只是創建、調度的開銷要比進程小。有的統計是1:10
用戶級線程:
(1)用戶級線程僅存在於用戶空間。——>對比內核(3)
(2)內核並不能看到用戶線程。——>重要的區別

(3)內核資源的分配仍然是按照進程進行分配的;各個用戶線程只能在進程內進行資源競爭。


3.從C++文件到生成exe 文件經過哪三個步驟?

預編譯,編譯優化,彙編,鏈接


4.有個二維數組 A(6*8),每個元素佔 6 字節,起始地址爲 1000,請問最後一個元素 A[5][7]的起始地址爲??? 數組A佔內存大小爲??? 假設以行優先,則A[1][4]起始地址爲???

1)1000 + 6*6*8 - 8 = 11282; 2)6*6*8=288; 3)A[1][4]位置爲5行2列,1000+6*(8*1+4) = 1272.


如果給出結構體,考慮到字節對齊的話就要另外考慮了。



5.用C語言把雙向鏈表中的兩個結點交換位置,考慮各種邊界問題。 

考慮三種情況:第一個結點在頭,第一個結點在中間,第一個結點在尾巴。

struct Node{       Node* prev;          Node* next;          void* data;      };      struct LinkedList{       Node*    head;       Node*    tail;       Node*    cur;       int      size;   };   bool exchange(LinkedList* list,Node *node1,Node *node2)  {      if(node1== NULL || node2==NULL)      return false;     Node *p,*q; 	//node1 on the front     if(list->head->next == node1)     {     	//node2 on the last     	if(list->tail->next == node2)     	{     		p = node2->prev;     		//Cope with node2     		list->head->next = node2;     		node2->prev = list->head;     		node2->next = node1->next;     		node2->next->pre = node2;     		//Cope with node1     		list->tail->prev = node1;     		node1->next = list->tail;     		node1->prev = p;     		p->next = node1;     		return true;     	}     	//node2 not on the last     	else     	{     		p = node2->prev;     		q = node2->next;     		//Cope with node2     		list->head->next = node2;     		node2->prev = list->head;     		node2->next = node1->next;     		node2->next->prev = node2;     		//Cope with node1     		p->next = node1;     		node1->prev = p;     		node1->next = q;     		q->prev = node1;     		return true;     	} 		     }     //node1 on the last     else if(list->tail->next == node1)     {     	//node2 on the front     	if(list->head->next == node2)     	{ 			p = node1->prev;     		//Cope with node1     		list->head->next = node1;     		node1->prev = list->head;     		node1->next = node2->next;     		node1->next->prev = node1;     		//Cope with node2     		list->tail->prev = node2;     		node2->next = list->tail;     		node2->prev = p;     		p->next = node2;     		return true;     	}     	//node2 not on the front     	else     	{     		p = node2->prev;     		q = node2->next;     		//Cope with node2     		list->tail->next = node2;     		node2->prev = list->tail;     		node2->next = node1->next;     		node2->next->prev = node2;     		//Cope with node1     		p->next = node1;     		node1->prev = p;     		node1->next = q;     		q->prev = node1;     		return true;     	}     }     //node1 on the middle     else     {     	//node2 on the front     	if(list->head->next == node2)     	{     		p = node1->prev;     		q = node1->next;     		node1->prev = list->head;     		list->head->next = node1;     		node1->next = node2->next;     		node2->next->prev = node1;     		     		node2->prev = p;     		p->next = node2;     		node2->next = q;     		q->prev = node2;     	}     	//node2 on the last     	else if(list->tail->next == node2)     	{     		p = node1->prev;     		q = node1->next;     		node1->prev = node2->prev;     		node2->prev->next = node1;     		node1->next = list->tail;     		list->tail->prev = node1;     		     		node2->prev = p;     		p->next = node2;     		node2->next = q;     		q->prev = node2;     	}     	//both in the middle     	else     	{     		p = node2->prev;     		q = node2->next;     		//Cope with node2     		node2->prev = node1->prev;     		node1->prev->next = node2;     		node2->next = node1->next;     		node1->next->prev = node2;     		//Cope with node1     		p->next = node1;     		node1->prev = p;     		node1->next = q;     		q->prev = node1;     		return true;     	}     }  } 




6.*.dll,*.lib,*.exe 文件分別是什麼,有什麼區別?

lib是靜態的庫文件,dll是動態的庫文件。
所謂靜態就是link的時候把裏面需要的東西抽取出來安排到你的exe文件中,以後運行exe的時候不再需要lib。
所謂動態就是exe運行的時候依賴於dll裏面提供的功能,沒有這個dll,exe無法運 行。

lib, dll, exe都算是最終的目標文件,是最終產物。而c/c++屬於源代碼。源代碼和最終 目標文件中過渡的就是中間代碼obj,實際上之所以需要中間代碼,是你不可能一次得到目 標文件。比如說一個exe需要很多的cpp文件生成。而編譯器一次只能編譯一個cpp文件。這 樣編譯器編譯好一個cpp以後會將其編譯成obj,當所有必須要的cpp都編譯成obj以後,再統 一link成所需要的exe,應該說缺少任意一個obj都會導致exe的鏈接失敗.



7.附加題(20):使用八叉樹算法把24位真彩色轉化成 256色。24位真彩色包括 R,G,B顏色,每種顏色8 位。

         在計算機中像素的計算單位一般是二進制的,256色,即2的8次方,因此我們也把256色圖形叫做8位圖;16位圖,它可以表達2的16次方即65536種顏色;還有24位彩色圖,可以表達16,777,216種顏色。

         算法參考:http://blog.csdn.net/zuzubo/article/details/1597985



8.有 11 盆花,圍成一圈,要求每次組合時,每盆花相鄰的兩盆花與上次不同,請問有多少排列方法? 

待解答。


9.2 只寵物合成,1只有 5技能,1 只有4 技能,每個技能有 a%概率遺傳,請問剛好有7 個技能遺傳成功的概率是?

只有

第一隻5個技能 + 第二隻2個技能:(a%)^7*C(4,2)

第一隻4個技能 + 第二隻3個技能:(a%)^7*C(5,4)*C(4,3)

第一隻3個技能 + 第二隻4個技能:(a%)^7*C(5,3)

加起來就可以了。


10.輸出結果爲?

#include <iostream> using namespace std; class A	 { public: 	A(){cout<<"1";} 	A(A &a){cout <<"2";} 	virtual ~A() {cout<<"3";} };  class B:public A { public: 	B(){cout<<"4";} 	B(B &b){cout<<"5";} 	~B(){cout<<"6";} };  int main() {     A* pa = new B(); 	delete pa; 	return 0; }


1463

子類構造之前首先調用基類的構造函數,然後是子類的構造函數,析構的時候相反,注意基類的析構函數聲明爲virtual纔可以.




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