面试题1:赋值运算符函数
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
private:
char* m_pData;
};
解析:先利用传进来的参数str创建一个临时实例temp,接着把temp.m_pData和实例自身的m_pData做交换。由于temp是一个局部变量,当程序运行到if外面时也就出了该变量的作用域,就会自动调用temp的析构函数,把temp.m_pData所指向的内存释放掉。又因为temp.m_pData已经指向实例之前m_pData的内存,这就相当于释放了实例之前的内存,那么现在实例的m_pData也指向了str的m_pData,完成了运算符重载。
1 CMyString& CMyString::operator=(const CMyString& str) 2 { 3 if (this != &str) 4 { 5 CMyString temp(str); 6 7 char* data = temp.m_pData; 8 temp.m_pData = this->m_pData; 9 this->m_pData = data; 10 } 11 12 return *this; 13 } 14
面试题2:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解析:首先选取一个角上的数字进行比较,这里我选择了右上角,可通过比较大小缩小查找的区域范围,找到则返回true,没找到返回false。例如:
1 bool Find(int* array, int rows, int columns, int number) 2 { 3 assert(array); 4 5 if (array!=NULL && rows > 0 && columns > 0) 6 { 7 int row = 0; 8 int col = columns - 1; 9 while (row < rows && col >= 0) 10 { 11 if (array[row*columns + col] == number) 12 { 13 return true; 14 } 15 else if (array[row*columns + col] > number) 16 { 17 --col; 18 } 19 else 20 { 21 ++row; 22 } 23 } 24 } 25 26 return false; 27 }
面试题3:替换空格
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。
解析:首先遍历一次字符串,统计空格数目,计算出替换之后的字符串长度。接着准备两个指针P1、P2,P1指向原字符串末尾,P2指向新字符串末尾,从后往前移动,遇到字符则复制,遇到空格则替换。
1 //length为字符数组str的总容量
2 void ReplaceBlank(char str[], int length)
3 {
4 if (str == NULL && length <= 0)
5 {
6 return;
7 }
8
9 //originalLen为字符串str的实际长度,numberOfBlank是空格数目
10 int originalLen = 0;
11 int numberOfBlank = 0;
12 int i = 0;
13 while (str[i] != '