今天做土豆的春季C++实习生招聘试题,很多不应该错的错了,在此挑出一些重要的错误,供自己参考,以免以后再犯。
一、一道编程题,很简单,但是错了。
题目:
输入一个数组,求它的逆序数组。如输入: 1 2 3 4,输出 4 3 2 1
它给出了框架,让填写部分代码:
#include<iostream> #include <vector> #include <string> using namespace std; class example { public: static const vector<int>& reverse1(const vector<int>& r) { vector<int> temp(r.begin(),r.end()); vector<int>::iterator vbegin=temp.begin(); vector<int>::iterator vend=temp.end()-1; while(vbegin<vend) { swap(*vbegin++,*vend--); } static const vector<int> temp2(temp.begin(),temp.end()); return temp2; } protected: private: }; void main() { int d[]={1,2,3,4,5}; vector<int> f(d,d+5); const vector<int> s=example::reverse1(f); copy(s.begin(),s.end(),ostream_iterator<int>(cout," ")); }
1.
vector<int>::iterator vend=temp.end()-1;
一定要注意temp的最后一个元素是end()-1,而不是end(),end()指向量中最后一个元素的下一个元素。
2.当返回类型是指针或引用时,必须强调使用static局部变量,否则使用普通的局部变量,一旦函数调用结束,变量就会释放掉,使得指针或引用指向不确定的对象。
3.静态成员函数,可以直接使用类名直接调用。
二、
int i=001+010+100;
cout<<i<<endl;
输出结果: 109
分析:
001,010 都是以0开头的8进制数,分别等于1,8,因此上式等于109
举一反三:
int i=0x001+0x010+100;
cout<<i<<endl;
输出结果: 117
分析:
0X001,0X010 都是以0x开头的16进制数,分别等于1,16,因此上式等于117
三、
编程题:
对于一个数字A,它的“DA(DA为一位整数)”数PA为A中所有DA拼成的数。例如1566的PA数为66,因为它有两个6。现在有两个数A和B,DA分别是DA1和DA2,求解A和B的PA书PA1+PA2? 0<A,B<10^30
例如 A:1566,DA1=6;于是PA1=66
B:4231554,DA2=5;于是PA2=55,PA1+PA2=66+55=121
由于A,B的范围较大,实际上已经超过了long long 的范围,所以属于大数据相加。
#include<iostream> #include <vector> #include <string> using namespace std; class example { public: static const string& calc(const string& stra,unsigned int a,const string& strb,unsigned int b)//这里a,b为一位整数 { int count_a=0; int count_b=0; int i=0,j=0; //计算stra中有多少个a for(string::const_iterator vbegin=stra.begin();vbegin!=stra.end();++vbegin) { if ((*vbegin-'0')==a) { count_a++; } } //计算strb中有多少个b for(string::const_iterator vbegin=strb.begin();vbegin!=strb.end();++vbegin) { if ((*vbegin-'0')==b) { count_b++; } } int na=count_a; int nb=count_b; int length=na>nb?na:nb; int* pa=new int[length+1];//由于stra可能都是a组成的,一旦相加有可能越位。 int* pb=new int[length+1]; memset(pa,0,(length+1)*sizeof(int)); memset(pb,0,(length+1)*sizeof(int)); //计算pa while (count_a--) { pa[i++]=a; } //计算pb while (count_b--) { pb[j++]=b; } for (int i=0;i<length;i++) { pa[i]=pa[i]+pb[i]; } int ncount=0;//相加的两个数的最终位数 for (int i=0;i<length;i++) { if (pa[i]>9) { int temp=pa[i]/10; pa[i+1]+=temp; pa[i]=pa[i]%10; ncount=length; } else { ncount=length-1; continue; } } //至此pa就是最后的结果,但是pa是反着的。可以参考我的博客:<a target=_blank href="http://blog.csdn.net/xiamentingtao/article/details/46362577">http://blog.csdn.net/xiamentingtao/article/details/46362577</a> static string s1; //整数转字符串 for (int i=ncount;i>=0;i--) { char s=pa[i]+'0'; s1.append(1u,s);//string& append (size_t n, char c); } delete[] pa; pa=NULL; delete[] pb; pb=NULL; return s1; } protected: private: }; void main() { const string vi=example::calc("12455555555555555555555555555",5,"45666666666666666666666666666666666666666666666666112",6); }
四、不能被重载为类的成员运算符的是哪些运算符?
1. 并不是所有的操作符都能被重载。除了. ,.* ,:: ,? : ,sizeof,typeid这几个运算符不能被重载,其他运算符都能被重载 2. 重载不能改变该运算符用于内置类型时的函义,程序员不能改变运算符+用于两个int型时的含义。 3. 运算符函数的参数至少有一个必须是类的对象或者类的对象的引用。这种规定可以防止程序员运用运算符改变内置类型的函义。 8.4 重载不能改变运算符的优先级。 8.5 重载不能改变运算符的结合律。 8.6 重载不能改变运算符操作数的个数。比如+需要两个操作数,则重载的+也必须要有两个操作数。