微软2013年暑期实习招聘笔试回忆[已补充完整]
刚考完,开始觉得做的还好,下来把不确定的验证下,发现悲剧了好多。。
总共20道选择题,全部不定项。总分100分,时间75分钟。去年时间是90分钟的。。。。
1~8,做对3分,半对2分,错误-2分,不做0分
9~18,做对5分,半对3分,错误-3分,不做0分
19~20,做对13分,半对7分,错误-7分,不做0分
以下只代表我记得的,不代表原试卷信息。
1、关于支持不定数量参数的方法(supportvariable parameters)有哪些?
(cdecl,stdcall,pascal,fastcall)
cdecl只有这一个。
2、以下代码输出的结果是:
class A { public: virtual void f() { cout<<"A::f"<<endl; } void f() const { cout<<"A::f const"<<endl; } }; class B:public A { public: virtual void f() { cout<<"B::f"<<endl; } void f() const { cout<<"B::f const"<<endl; } }; void g(const A* a) { a->f(); } int main() { A *b = new B(); b->f(); g(b); return 0; }
答案为:
B::f A::f const
第一个b->f()为动态绑定,输出B::f没问题,第二个,目前还没弄明白,
感觉是由于函数g的参数有const,所以调用成员函数也是调用const版本,但是const版本的不是虚函数,不存在动态绑定,所以输出A::f const。
3、linked list和array的区别,链表与数组的区别。
4、线程Thread和进程Process的区别(下列关于...和...说法正确的是?)好像是指明了windows下的。
5、更奇葩的:
int i=10,j=10; i = i++; j = ++j; cout<<i<<","<<j;
问输出结果:
使用g++编译,直接警告这是未定义的。。。。。
当然也给出了结果11,11.
使用vc编译,没有任何警告,结果也是11,11.
class C { public: long a; }; class D:public C { public: long b; }; void seta(C *data, int index) { data[index].a = 2; } int main() { D data[4]; cout<<sizeof(C)<<","<<sizeof(D)<<endl; for(int i=0;i<4;++i) { data[i].a = 1; data[i].b = 1; seta(data,i); } for(int i=0;i<4;++i) { cout<<data[i].a<<data[i].b; } return 0; }
答案:22221111.
这个做错了。。。。。觉得不可能这么简单,果然有猫腻。。
seta中,参数是基类C类型的指针,然后移动指针取对象并赋值,
但是main中往函数seta中传递的是派生类的对象,所以对象被截取了。。。再按照基类去取对象,只取出了一部分
自己慢慢体会吧。。。
9、1000瓶中有1瓶毒药,喂老鼠,问至少多少只老鼠,才能识别毒药?
(2^n > 1000),n=10即可。
10.下列代码输出值为1的是?(其中选项有return 1&7,return "ab" == "ab")
1&7=1;
gcc下会对"ab" == "ab"警告:比较字面值是未定义的行为。但是结果也给出1.
11、32位有符号数x,x/2不等于x>>1的情况?
12、3*4的表格grid,可能找出多少个方框?(6 0)
13、一条直线可以将平面分2部分,2条可以分4部分,问100条可以分多少部分?
自己画画吧,我当时没读懂题意,空着。。。
14、稳定的排序方法?
选项:有(冒泡排序、快排、堆排序、希尔排序、归并排序)
15、关于MVC中M、V、C的职责描述
16、二叉树的还原(必须要有中序,外加其他的任一一个)
17、n长度的string,求它substring子串的可能性
2^n - 1个
18、sql执行,影响的结果条数?(涉及in、group、sum关键字)
19、单向图的最短路径?不需要算法,画画就出来了。放最后真浪费。。。那么高的分数。。
20、有N个球,只有一个的质量和其他的不同,给你一个天平,允许称3次(只能称相等或不等,没有刻度的),问下面可能的N有?
(<= 3 ^ 3的均可以)