2014暴風影音

1.已知一個二叉樹的先序遍歷和中序遍歷得到的序列爲ABDEGCFH和DBGEAFHC,請
1)根據先序遍歷和中序遍歷計算出該二叉樹的結構圖
2)根據1)的結果,計算該二叉樹的後序遍歷
後序遍歷結果:DGEBHFCA
3)完成後序遍歷代碼(不得使用迭代函數)
void postorder(BinarySearchTree T)
{
	BinarySearchTree preNode, currNode;
	stack<BinarySearchTree> s;

	preNode = NULL;
	s.push(T);
	while(!s.empty())
	{
		currNode = s.top();
		if(preNode == NULL || preNode->m_pLeft == currNode || preNode->m_pRight == currNode)
		{
			if(currNode->m_pLeft)
				s.push(currNode->m_pLeft);
			else if(currNode->m_pRight)
				s.push(currNode->m_pRight);
		}
		else if(currNode->m_pLeft == preNode)
		{
			if(currNode->m_pRight)
				s.push(currNode->m_pRight);
		}
		else
		{
			cout << currNode->m_nValue;
			s.pop();
		}
		preNode = currNode;
	}
}
2. 將內存中一張寬爲X,高爲Y的RGB32格式的圖片向右旋轉90度。源地址BYTE *pSrc爲指向圖片的首地址,目標地址BYTE *pDst爲輸出的目標緩衝區
備註:RGB32是一種圖像格式,它用4個連續BYTE來表示一個像素,圖片的存儲方式爲一行一樣連續存儲。
A B
C D
如上表爲寬度爲2且高度爲2的圖像,共4個像素,在內存中存儲爲A[4]B[4]C[4]D[4]
void rotate(BYTE *pSrc, BYTE *pDest, int X, int Y){ }
解:此問題先考慮每個像素佔一個字節的情況,然後再將問題擴展爲佔四個字節的情況。
假設現在有8個像素,寬度爲4高度爲2,即
ABCD
EFGH
旋轉之後變爲寬度爲2,高度爲4,即
EA
FB
GC
HD
A[0][0]->A[0][1]
B[0][1]->B[1][1]
C[0][2]->C[2][1]
D[0][3]->D[3][1]
E[1][0]->E[0][0]
F[1][1]->F[0][1]
G[1][2]->G[0][2]
H[1][3]->H[0][3]
第0行的變爲了第(x-1)列,其中原矩陣中的列號與旋轉矩陣的行號相同,第(x-1)行變換爲了第0行,其中原矩陣的列號與旋轉矩陣的行號相同
這裏用i表示行,j表示列,則旋轉後的pDest[j][x-i-1] = pSrc[i][j],然後將其擴展爲4字節問題,即賦值時要一次性複製4字節。代碼如下
typedef char BYTE;
const int size = 4;//4字節
void rotate(BYTE *pSrc, BYTE *pDest, int x, int y)
{
	for(int i = 0; i < x; i++)
	{
		for(int j = 0; j < y; j++)
		{
			int dpos = (j * x + (x - i - 1) ) * size;
			int spos  = (i * y + j) * size;
			for(int k = 0; k < size; k++)//每次複製4個字節
				pDest[dpos + k] = pSrc[spos + k];
		}
	}
}
3. 給定字符串A和B,輸出A和B中第一個最長公共子串,比如A="wepiabc",B="pabcni"則輸出“abc”
#define MAXLEN 50
void LCS(char *A, char *B, char *sub, int tmp[][MAXLEN])
{
	int i, j, max, pos, len_a, len_b;

	len_a = strlen(A);
	len_b = strlen(B);
	
	max = 0;
	pos = -1;

	for(i = 0; i < len_a; i++)
	{
		for(j = 0; j < len_b; j++)
		{
			if(A[i] == B[j])
			{
				if(i == 0 || j == 0)
					tmp[i][j] = 0;
				else
					tmp[i][j] = tmp[i-1][j-1] + 1;
				if(max < tmp[i][j])
				{
					max = tmp[i][j];
					pos = i;
				}
			}
		}
	}
	sub[max] = '\0';
	for(i = 0; i < max; i++)
		sub[max-i-1] = A[pos - i];
}
4. TCP建立連接需要幾次握手過程?爲什麼會採用這麼多次握手,請簡述過程。若最後一次握手失敗,會怎樣處理?
解:1)TCP建立連接需要3次握手
2)

3)第三次握手失敗,服務器端處於SYN_RCVD狀態,服務器端發送復位報文請求建立連接(不知道理解對不對)

5. ClassA是一個類,那麼語句ClassA a, *b[2], c[3], &d = a;執行時調用到ClassA的構造函數次數爲:4(a調用一次,c[3]調用3次)
6. 32位系統中

struct
{
	char buf[2];//對齊以後佔4字節
	int i;//4字節
	char c;//4字節
}sT;
請問sizeof(sT)=?多少 12
7. 甲和乙進行打靶比賽,各打兩發子彈,中靶數量最多的人獲勝,甲每發子彈中彈的概率是60%,而乙每發子彈中靶的概率是30%,則比賽中乙戰勝甲的可能性:
A 小於5%    B 在5%~12%之間   C在10%~15%之間    D大於15%
解:乙獲勝情況分爲兩種,甲中0次,乙至少中靶一次;甲中靶1次,乙中靶兩次。
(0.4*0.4)*(1-0.7*0.7) = 0.0816
(2*0.6*0.4)*(0.3*0.3) = 0.0432,故乙獲勝的概率爲12.48%
8. 請回答下列程序執行後的輸出結果
	char *A = "this is a string!", *B = NULL;
	int n = 10;
	memcpy(B,A,n);
	printf(B);

因爲B是野指針,會導致運行時錯誤。

9. 分別指出下列操作系統是哪一種類型?(單用戶單任務/單用戶多任務/多用戶單任務/多用戶多任務)
DOS、Windows 7、Windows 2003、Linux、Unix
DOS:單用戶單任務
Windows 7:多用戶多任務
Linux、Unix:多用戶多任務
Windows 2003(Windows Server 2003):多用戶多任務
Windows XP及以前Windows版本:單用戶多任務
注:參考鏈接
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章