今天做土豆的春季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中有多少個afor(string::const_iterator vbegin=stra.begin();vbegin!=stra.end();++vbegin){if ((*vbegin-'0')==a){count_a++;}}//計算strb中有多少個bfor(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));//計算pawhile (count_a--){pa[i++]=a;}//計算pbwhile (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 重載不能改變運算符操作數的個數。比如+需要兩個操作數,則重載的+也必須要有兩個操作數。