笔试题目收集(2)
1.下列程序运行的结果:(面试宝典P108)
#include<iostream> #include<string> using namespace std; class classType{ private: int x,y; public: classType(int a):y(a),x(y) {} int getx(){return x;} int gety(){return y;} }; int main() { classType obj(98); cout<<obj.getx()<<" "<<obj.gety()<<endl; getchar(); return 0; }
结果:输出结果第一个数为随机数,第二个数为98。
分析:类中先声明x,后声明y,所以在初始化成员变量时先初始化x,再初始化y的顺序。将上面改为int y,x,得到预期的输出,即98 98。
2.指出下面程序的错误,把静态成员数据声明为私有,该如何访问?
class A{ const int size=0; };
错误:上面的错误应该是没有定义性说明(我认为面试宝典的这道题答案有点问题)。
方法1可以改为如下:
class A{ static const int size; }; int A::size = 0;
类中的成员声明不能赋初值(静态成员除外,且静态成员在定义性说明的时候赋初值,如果不赋初值则取默认值,但是必须要定义性说明),因为类只是一种导出的类型,不分配空间。
方法2可以改为如下:(面试宝典给出答案有误,正解如下)
class A{ const int size; A():size(0){}//const变量必须在初始化列表中 };
静态成员设为私有只能通过静态的成员函数访问。
3.数组循环移位
解法1:
RightShift(int *arr,int N,int K) { K%=N;
while(k--){ int t=arr[N-1]; for(int i=N-1;i>0;i--){ arr[i]=arr[i-1]; arr[0]-t; } }
解法2:
Reverse(int *arr,int b,int e) { K%=N; for(;b<e;b++,e--){ int tmp = arr[b]; arr[b] = arr[e]; arr[e] = tmp; } } RightShift(int *arr,int N,int K) { K%=N; Reverse(arr,0,N-K-1); Reverse(arr,N-K,N-1); Reverse(arr,0,N-1); }
4.插入排序、选择排序和冒泡排序代码(上次去阿里笔试,插入排序还写错了,丢人,这次一定要狠心记住)
插入排序:
void InsertionSorter(int *arr,int len) { for(int i=1;i<len;i++){ int t = arr[i]; int j = i; while(j>0&&arr[j-1]>t){ arr[j] = arr[j-1]; j--; } arr[j] = t; } }
选择排序:
void SelectionSorter(int *arr,int len) { for(int i=0;i<len-1;i++){ int k = i; for(int j = i+1;j<len;j++){ if(arr[j] < arr[k]) k = j; } if(k!=i) { int t = arr[k]; arr[k] = arr[i]; arr[i] = t; } } }
冒泡排序:
void BubbleSorter(int *arr,int len) { for(int i=0;i<len-1;i++){ bool flag = false; for(int j = 0;j<len-i-1;j++){ if(arr[j]>arr[j+1]){ int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; flag = true; } } if(!flag)break; } }
待续....