笔试面试题目8
来源:互联网 发布:浪潮软件 编辑:程序博客网 时间:2024/05/21 08:55
1. 写一个 String类,以及构造函数能是虚函数吗?
构造函数能够声明为虚函数?
由虚函数的机制我们可知,每个类需要一个虚函数表,虚函数表的指针放在本类对象的最前面四个字节(一个指针的大小)。
虚函数表的初始化是在本类的构造函数调用时完成的,因此即使将构造函数声明为虚函数也不起作用。
2. 在一个Array中,有一些数字为0,那么将 这些为0的数字所在的行,列都设置为0。但是对于新设置的元素,不再对其进行重复设置
1 2 3
4 0 5
6 7 0
在本题目中,(1,1)处元素为0,(2,2)出元素为0,这样将第一行,第一列(从0列开始),第二行,第二列的元素都设置为0。对于(0,1)处的元素为新设置为0的元素,因此不需要对其所在行列进行设置了。
直接使用一个动态Array,将为0的元素下标(row,col)放入到数组中,再遍历数组中的元素,依次将元素对应的行列置为0。
3. 二叉树,找到其中两个节点的公共祖先。
见前面的题目中,里面有寻找节点路径的题目,本题目就在那个题目的基础上加上,寻找两个节点的路径,再分别寻找路径中第一个不同节点的上一个节点,即为我们要寻找的公共节点。
4. 一个整数A,寻找由A的各位上的数字组成的比A大的整数里面那个最小的整数。
例如: 12345,比它大的数字中最小的数字,12354
134651 对应要找的数字应该为 135146
思路:首先将整数转化为字符串,放到数组中,然后从数字的最低位开始查找,第一个有比其低的位数字小的一个数,将其与比起低的位中最大数进行交换。
再对所找到数字的低位进行排序(升序)。即可得到题目答案。
1 2 3 3 6 9
4 5 6 ---> 2 5 8
7 8 9 1 4 7
可以将整个矩阵放到坐标轴上,一个点代表其对应的坐标值。
class string{friend std::istream& operator>>(std::istream& is, string& str);friend std::ostream& operator<<(std::ostream& os, string& str);public:string() //默认构造函数{ m_length = 0;m_pdata = new char[1];m_pdata[0] = '\0';}string( char *str = NULL);// 构造函数string( int len, char ch);~string();// 析构函数string( string &str); // 复制构造函数int size(){ return m_length;}// 获得字符串长度string operator+(const string& str);// 重载'+'操作符string& operator+=(const string& str);// 重载'+='操作符string& operator=(const string& str);// 重载赋值操作符bool operator==(const string &s1,const string &s2);// 比较两个字符串是否相等char& operator[]( int index);// 重载下标操作符string substr( int pos,int len);// 返回子字符串string substr( int pos); // 返回子字符串 private:char *m_pdata;int m_length;};string::string(char *str) // 构造函数{m_length = strlen(str);m_pdata = new char[length+1];if(m_pdata != NULL){strcpy( m_pdata, str);}}string::string( int len, char ch);{m_pdata = new char[len+1];for(int i = 0; i < n; i++){m_pdata[i] =a;}m_pdata[len] = '\0';}string::~string() // 析构函数{if( m_pdata != NULL){delete [] m_pdata;}length = 0;}string::string(string &str) // 复制构造函数{m_length = str.size();m_pdata = new char[length+1];for( int i = 0; i < length; i++){m_pdata[i] = str.m_pdata[i];}b[m_length] = '\0';}string string::operator+(const string& str) // 重载+{int newLen = m_length + str.m_length;char *newstr = new char[newLen+1];int count = 0;for( int i = 0; i<length; i++){newstr[i] = this->b[i];count++;}for( int i =0; count < newLen; count++,i++){newstr[i] = a.b[i];}newstr[newLen] = '\0';string temp(newstr);delete [] newstr;return temp;}string& string::operator+=(const string& str) // 重载+={int newLen = length + str.length;char *newstr = new char[newLen+1];int count = 0;for(int i = 0; i < length; i++){newstr[i] = this->m_pdata[i];count++;}for(int i =0;count<newLen;count++,i++){newstr[i] = str.m_pdata[i];}newstr[newLen] = '\0';string temp(newstr);*this = temp;delete [] newstr;return *this;}string& string::operator=(const string &str) // 重载={if(this == &str)return *this;delete [] m_pdata;m_length = str.m_length;m_pdata = new char[m_length+1];for(int i = 0; i < m_length; i++){b[i] = a.b[i];}b[length] = '\0';return *this;}bool string::operator==(const string &s1,const string &s2){if( s1.m_length != s2.m_length){return false;}for( int i = 0; i < s1.m_length && i < s2.m_length; i++){if( s1.m_data[i] != s2.m_data[i]){return false;}}return true;}char& string::operator[]( int index) // 重载下标操作符{if( index > m_length)return m_pdata[m_length-1];elsereturn m_pdata[index];}ostream& operator<<(ostream& os, string& str) //重载输出符{os << str.m_pdata;return os;}istream& operator>>( std::istream& is, string& str) //重载输入符{ is >> str.m_pdata;str.m_length = strlen(str.m_pdata);return is;}string string::substr( int pos, int len) // 两个接受不同参数的substr函数,返回子字符串{char *p = new char[n+1];for(int i=0;i<n;i++){p[i]=b[pos];pos++;}p[n]='\0';string k(p);k.m_length=n;delete [] p;return k;}string string::substr( int pos){int len = m_length;char *p = new char[len-pos+1];int t = pos;for( int i = 0; t < len; t++,i++){p[i] = b[t];}p[t]='\0';string k(p);k.m_length = len-pos;delete [] p;return k;}运算符 ">", "<", ">=", "<="和"!="均需要被重载用于字符串的比较,此处省略。
构造函数能够声明为虚函数?
由虚函数的机制我们可知,每个类需要一个虚函数表,虚函数表的指针放在本类对象的最前面四个字节(一个指针的大小)。
虚函数表的初始化是在本类的构造函数调用时完成的,因此即使将构造函数声明为虚函数也不起作用。
2. 在一个Array中,有一些数字为0,那么将 这些为0的数字所在的行,列都设置为0。但是对于新设置的元素,不再对其进行重复设置
1 2 3
4 0 5
6 7 0
在本题目中,(1,1)处元素为0,(2,2)出元素为0,这样将第一行,第一列(从0列开始),第二行,第二列的元素都设置为0。对于(0,1)处的元素为新设置为0的元素,因此不需要对其所在行列进行设置了。
直接使用一个动态Array,将为0的元素下标(row,col)放入到数组中,再遍历数组中的元素,依次将元素对应的行列置为0。
3. 二叉树,找到其中两个节点的公共祖先。
见前面的题目中,里面有寻找节点路径的题目,本题目就在那个题目的基础上加上,寻找两个节点的路径,再分别寻找路径中第一个不同节点的上一个节点,即为我们要寻找的公共节点。
4. 一个整数A,寻找由A的各位上的数字组成的比A大的整数里面那个最小的整数。
例如: 12345,比它大的数字中最小的数字,12354
134651 对应要找的数字应该为 135146
思路:首先将整数转化为字符串,放到数组中,然后从数字的最低位开始查找,第一个有比其低的位数字小的一个数,将其与比起低的位中最大数进行交换。
再对所找到数字的低位进行排序(升序)。即可得到题目答案。
#include <iostream>#include <vector>#include <algorithm>using namespace std;void PrintBiggerNum( unsigned int Num){ int num[30] = {0}; int count = 0; unsigned int tmp = Num; while( tmp > 0) { num[count++] = tmp % 10; tmp /= 10; } int max = 0; int i = 0; for( i = 0; i < count; i++) { if( max < num[i] && i != 0) { max = num[i]; } else if(max > num[i] && i != 0) { for( int j = 0; j < i; j++) { if( num[j] > num[i]) { tmp = num[i]; num[i] = num[j]; num[j] = tmp; break; } } break; } } sort(num, num+i, greater<int>()); cout << Num << " ---> "; for( int i = count-1; i >= 0; i--) { cout << num[i]; } cout << endl; return ;}int main(){ PrintBiggerNum(134651); return 0;}5. 数组逆时针旋转90度,以及证明你的方法的有效性
1 2 3 3 6 9
4 5 6 ---> 2 5 8
7 8 9 1 4 7
#include <iostream>#include <vector>#include <algorithm>using namespace std;#define ARRAY_LEN 3int NumArray[ARRAY_LEN][ARRAY_LEN];void RotateArray(){ int i = 0, j = 0; for( i = 0; i < ARRAY_LEN; i++) { for( j = i+1; j < ARRAY_LEN; j++) { int temp = NumArray[i][j]; NumArray[i][j] = NumArray[j][i]; NumArray[j][i] = temp; } } for( i = 0; i < ARRAY_LEN/2; i++) { for( j = 0; j < ARRAY_LEN; j++) { int temp = NumArray[i][j]; NumArray[i][j] = NumArray[ARRAY_LEN - 1 - i][j]; NumArray[ARRAY_LEN - 1 - i][j] = temp; } } return ;}int main(){ int index = 1; for( int i = 0; i < ARRAY_LEN; i++) { for( int j = 0; j < ARRAY_LEN; j++) { NumArray[i][j] = index++; } } for( int i = 0; i < ARRAY_LEN; i++) { for( int j = 0; j < ARRAY_LEN; j++) { cout << NumArray[i][j] << " "; } cout << endl; } cout << "<------------->" << endl; RotateArray(); for( int i = 0; i < ARRAY_LEN; i++) { for( int j = 0; j < ARRAY_LEN; j++) { cout << NumArray[i][j] << " "; } cout << endl; } return 0;}对于证明其正确性:
可以将整个矩阵放到坐标轴上,一个点代表其对应的坐标值。
可以推导出相应的坐标对应。
By Andy @ 2013年11月1日
- 笔试面试题目8
- Intel笔试面试题目
- 常见笔试/面试题目
- 软件面试笔试题目
- 笔试面试题目小结
- 微软笔试面试题目
- 笔试,面试题目网站
- 笔试面试题目
- C++ 笔试面试题目
- 笔试面试题目
- 笔试面试题目
- 笔试面试题目
- 笔试面试题目1
- 笔试面试题目2
- 笔试面试题目3
- 笔试面试题目5
- 笔试面试题目6
- 笔试面试题目7
- 设置网页图标
- Java中的Socket通信
- apache 虚拟主机
- 微软图表控件MsChart使用介绍
- Objective-C 对象和消息模型
- 笔试面试题目8
- 使用MSMQ消息队列的WCF的效率的问题。
- 事务隔离级别
- chmod 命令详解 Linux
- apache shiro集群实现(二)— cache共享
- perl创建mysql数据库
- 小米整屏移动,小米2S
- 串口线定义
- 2013年11月1日单片机C语言总结