1)从一个表达式字符串中找到最深层圆括号内的表达式。如:从字符串x+(y*z)+(m-(3+4))中找到3+4.如果有多个表达式具有相同的最深深度则只需给出其中一个。
备注:算术表达式本身是正确的,不用考虑括号不匹配等错误表达式的处理。
(2)我们通常使用子网掩码的形式表示IP段,如:172.16.2.64-172.16.2.127表示为
172.16.2.64/26。请写出172.16.2.96-172.16.2.255的掩码形式。
(3)输入字符串,可能包含’,’ 或者数字,将这个字符串转换为整数
例如:输入123,345
输出: 123345
输入:,
输出:-1(错误码)
输入: 123,
输出:-1(错误码)
(4)给定一个 n * n 的网格,假设从网格的左上方开始走,每次只能向下或者向右,走到最右下方停止,问一共有多少种走法。
假设:2*2的网格,一共有6种走法。
3*3的网格,一共有20种走法
(5)
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; } }
(6)
将内存中一张宽为X,高为Y的RGB32格式的图片向右旋转90度。源地址BYTE *pSrc为指向图片的首地址,目标地址BYTE *pDst为输出的目标缓冲区
备注:RGB32是一种图像格式,它用4个连续BYTE来表示一个像素,图片的存储方式为一行一样连续存储。
A | B |
C | D |
此问题先考虑每个像素占一个字节的情况,然后再将问题扩展为占四个字节的情况。
假设现在有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]; } } }
(7)
#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]; }
(8)
1)TCP建立连接需要3次握手
2)
3)第三次握手失败,服务器端处于SYN_RCVD状态,服务器端发送复位报文请求建立连接(不知道理解对不对)