微软2013校园招聘笔试题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微软2013校园招聘笔试题
把微软的这个笔试题贴出来,纯粹是为了方便大家学习交流,相信微软不会那么小气来追究我的责任吧。
确实觉得微软出的这些题都不错,虽然只有20道选择,但是考察的面很全,数据结构,网络,算法,操作系统,概率等等都包括进去了。
而且答错扣分,不答0分,答对一部分给一部分的分这种给分机制非常合理,避免了有人乱蒙,且对知识点的理解错误会有所惩罚。
能够真正将一个人的计算机知识水平考察出来,所以值得好好研究这些笔试题目。
不废话了,看题。
答案及分析在后面,这些都是我通过查资料和自己的思考做的,本人水平有限,一定有所疏漏或错误,欢迎大家指正交流。
2. 下面哪一项不能用于Windows中进程间通信?
A. 命名事件
B. 命名管道
C. 临界区
D. 共享内存
3. 下面哪一种操作不是stack的基本操作?
A. 入栈
B. 出栈
C. 检查是否为空
D. 排序栈中元素
4. 下面哪一种属于“creational”的设计模式?
A. Façade
B. Singleton
C. Bridge
D. Composite
E. 上面都不是
解析:
创建型模式有:
闲话少说,设计模式分为三个大类,包括创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式(Behavioral Patterns)。
下面分别对这三个分类进行说明,讲述每一个分类中都包含哪些具体的设计模式。
创建型模式(Creational Patterns)
创建型模式主要考虑系统设计中与资源的合理利用相关的创建方式,尤其是在面向对象设计中,创建对象对所设计的系统来说,是存在一定的开销的。
如何能够选择合适的创建方法,选择合适的模式来完成软件设计,能够使系统被良好地设计。
创建型模式主要包括如下6个具体模式:
01.简单工厂模式(Simple Factory)
02.工厂方法模式(Factory Method)
03.抽象工厂模式(Abstract Factory)
04.建造模式(Builder)
05.原型模式(Prototype)
06.单例模式(Singleton)
结构型模式(Structural Patterns)
系统中已经创建了一些用来完成具体功能的对象,然后要考虑的是如何有效地管理这些存在于系统中的资源,在面向对象设计中,这些资源以对象(实例)的形式呈现。
由于系统中可能存在大量的对象,而且每个对象很可能不是独立存在地,必然要与其他的对象相互关联,即对象之间存在依赖性。
如果通过在设计中研究未来系统中这些对象的组织结构的设计,不仅能够提高系统的性能,还能够使系统易于维护。
从模块的角度来看,合理的设计结构能够实现系统中各个模块之间解耦,不至于使系统遭遇“牵一动百”的痛苦。
可见,结构模式还是非常基础的设计模式。
结构型模式主要包括如下7个具体模式:
01.门面模式(Facade)
02.适配器模式(Adapter)
03.代理模式(Proxy)
04.装饰模式(Decorator)
05.桥梁模式(Bridge)
06.组合模式(Composite)
07.享元模式(Flyweight)
行为型模式(Behavioral Patterns)
基于上述两类模式,接下来要考虑的是系统中存在的对象之间的交互关系的设计,即对象的行为。
采用什么样的交互方式,如何进行协作才能更好地实现系统的功能,提高系统的性能,这是行为型模式所关心的设计问题。
行为型模式主要包括如下11个具体模式:
01.模板方法模式(Template Method)
02.观察者模式(Observer)
03.状态模式(State)
04.策略模式(Strategy)
05.职责链模式(Chain of Responsibility)
06.命令模式(Command)
07.访问者模式(Visitor)
08.调停者模式(Mediator)
09.备忘录模式(Memento)
10.迭代器模式(Iterator)
11.解释器模式(Interpreter)
5. 当建立连接时,下面哪一个数据包发送顺序是正确的TCP握手协议过程?
A. SYN,SYN+ACK,SYN+ACK
B. SYN+ACK,SYN+ACK,SYN
C. SYN,SYN+ACK,RST
D. SYN,SYN,ACK
E. 以上都不是
TCP三次握手应该是:SYN、SYN+ACK、ACK。
6. 函数式编程的性质有?(TheCharacteristicsof functional programming are?)
A. Avoidof changing state and mutable data
B. Referentialtransparency
C. Lambdacalculus
D. Threadsafe
E. All of Above
7. 关于HTTP协议说明,哪些是正确的?
A. 在CS模式下,作为一种request-response协议
B. 无状态,对每一个请求看成独立的
C. WWW和Email使用的协议
D. HTTP响应包括数字状态码,404经常代表“PageNot Found”
E. 以上都不是
解析:
E-MAIL使用SMTP协议。
9. 4个袋子,15个球,每个袋子至少放一个球,而且袋子中的球数量不能重复,有多少种方式?
A. 4
B. 5
C. 6
D. 7
解析:
1,2,3,9
1,2,5,7
1,3,4,7
1,3,5,6
2,3,4,6
11. 有两个32bit的数A、B,使用下面方式得到32bit的数C、D。
哪一种可以使用C、D 得到A、B的值
A. C=(int32)(A+B),D=(int32)(A-B)
B. C=(int32)(A+B),D=(int32)((A-B)>>1)
C. C=(int32)(A+B),D=B
D. C=(int32)(A+B),D=(int32)(A+2*B)
E. C=(int32)(A*B),D=(int32)(A/B)
解析:
B项D中有移位,会损失数据,因此不能恢复。
12. 如果一个二叉树的前序遍历结果是abcdefg,下面哪一个是可能的中序遍历结果?
A. abcdefg
B. gfedcba
C. bcdefga
D. bceadfg
E. bcdaefg
13. T(n)=1(n<=1),T(n)=25+T(n/5)+n^2,T(n)复杂度是多少?
A. O(nlogn)
B. O(n^2logn)
C. O(n^2)
D. O(n^3)
E. O(n^3logn)
14. 两个线程运行在双核机器上,每个线程主程序如下,线程1:x=1;r1=y;线程2:y=1;r2=x。
x和y是两个全局变量,初始为0。
以下哪一个是r1和r2的可能值?ABC
A. r1=1,r2=1
B. r1=1,r2=0
C. r1=0,r2=1
D. r1=0,r2=0
15. 有n个元素的完全二叉树的深度是:
A. D(n)=log2(n)
B. D(n)=1+log2(n)
C. D(n)=n+log2(n)
D. D(n)=1+n*log2(n)
16. 1,2,3,…999,1000?
A. 189
B. 191
C. 193
D. 195
17. 2月28日出生和2月29日出生的人的比例是多少?2012年2月28日和2012年2月29日出生的人的比例是多少?B
A. 1:1和1:1
B. 4:1和1:1
C. 1:1和4:1
D. 4:1和4:1
18. 下面哪些使用的是贪心算法
A. 单源最短路径中的Dijkstra算法
B. 最小生成树的Prim算法
C. 最小生成树的Kruskal算法
D. 计算每对顶点最短路径的Floyd-Warshall算法
E. 字符串匹配中的KMP算法
解析:
D、E使用的是动态规划。
19.
Class A{
Public:
Intk1;int k2;
};
一个数组A a[5]={{3,4},{6,5},{2,7},{3,1},{1,2}}
下面哪一个是函数调用之后的结果
{{1,2},{2,7},{3,1},{3,4},{6,5}}
A. f1(a,5,cmp)
B. f2(a,5,cmp)
C. f3(a,5,cmp)
D. f4(a,5,cmp)
E. 以上都不对
20.
<word>:: <letter>|<letter><pairlet>|<letter><pairdig>
<pairlet>:: <letter><letter>|<pairlet><letter><letter>
<pairdig>::<digit><digit>|<pairdig><digit><digit>
<letter>::a|b|c|…|y|z
<digit>::0|1|2|…|9
下面哪一个词可以从<word>的规则中产生?Iabcd II bcdef III d22
A. 都不是
B. 只有I和II
C. 只有I和III
D. 只有II和III
E. I和II和III都是
答案与分析:
2. 下面哪一项不能用于Widows中进程间通信?
A. 命名事件
B. 命名管道
C. 临界区
D. 共享内存
答案:C
Wiki的结果是,Windows中进程间通信方式有:File, 管道(Pipe),命名管道(named pipe),信号(Signal),消息队列(Message queue),共享内存(shared memory),内存映射(memory –mapped file),信号量(semaphore),套接口(Socket)。
不太确定命名事件(Named Event)这个对不对,查了一些资料,好像也没有提到的,但是有些进程间通信代码会用到这个,有谁帮忙解释一下吗?而临界区事实上应该算是由信号量来保证的。
3. 下面哪一种操作不是stack的基本操作?
A. 入栈
B. 出栈
C. 检查是否为空
D. 排序栈中元素
答案:D
可以看一下stack的ADT结构,前三种都在基本操作函数中。
4. 下面哪一种属于“creational”的设计模式?
A. Façade
B. Singleton
C. Bridge
D. Composite
E. 上面都不是
答案:B
Creational包括下面几种: Singleton ;Factory Method ;Abstract Factory;Builder ;Prototype
5. 当建立连接时,下面哪一个数据包发送顺序是正确的TCP握手协议过程?
A. SYN,SYN+ACK,SYN+ACK
B. SYN+ACK,SYN+ACK,SYN
C. SYN,SYN+ACK,RST
D. SYN,SYN,ACK
E. 以上都不是
答案:E
这是握手的三次协议的更为详细的内容:
SYN, seqA
SYN, ACK=1,seqB, ack number=seqA+1
ACK=1, ack number=seqB+1
C中RST意思为:连接复位Resettinga connection。
想重置连接时,会发送RST数据包。
所以有人说,C应该也是可以的,因为可以在收到SYN+ACK后,设置发送RST,而且这种方式可以用在网络探测上,但是题目中明确说了是在建立TCP链接的时候正确的三次握手协议,所以我认为答案应该是选择E。
6. 函数式编程的性质有?(TheCharacteristicsof functional programming are?)
A. Avoidof changing state and mutable data
B. Referentialtransparency
C. Lambdacalculus
D. Threadsafe
E. All of Above
答案:E
这个wiki了一下,也不太懂,貌似就是说functionalprogramming是种编程典范,它将电脑运算视为数学意义上的函数的计算。
在wiki中,avoidsstate and mutable data,Lambdacalculus,Referential transparency 都有,Threadsafe而是正确的。
可以参考一下这个
/12717/
7. 关于HTTP协议说明,哪些是正确的
A. 在CS模式下,作为一种request-response协议
B. 无状态,对每一个请求看成独立的
C. WWW和Email使用的协议
D. HTTP响应包括数字状态码,404经常代表“PageNot Found”
E. 以上都不是
答案:A,B,D
Email使用的是STMP协议
HTTP还有一个特性是“无连接”:无连接的含义是限制每次连接只处理一个请求。
服务器处理完客户的请求,并收到客户的应答后,即断开连接。
采用这种方式可以节省传输时间。
9. 4个袋子,15个球,每个袋子至少放一个球,而且袋子中的球数量不能重复,有多少种方式?
A. 4
B. 5
C. 6
D. 7
E. 以上都没有
答案:C
可以这样数:
1,2,3,9
1,2,4,8
1,2,5,7
1,3,4,7
1,3,5,6
2,3,4,6
11. 有两个32bit的数A、B,使用下面方式得到32bit的数C、D。
哪一种可以使用C、D 得到A、B的值
A. C=(int32)(A+B),D=(int32)(A-B)
B. C=(int32)(A+B),D=(int32)((A-B)>>1)
C. C=(int32)(A+B),D=B
D. C=(int32)(A+B),D=(int32)(A+2*B)
E. C=(int32)(A*B),D=(int32)(A/B)
答案:C
注意考虑整数溢出问题,对于有符号数,A、C、D通过下面方式都可以恢复
第一项:A=(C+D)/2,B=C-A
第二项:D右移一位,不知道移出的是1还是0,不能恢复
第三项:A=C-D,B=D
第四项:B=D-C,A=C-B
第五项:虽然可以C*D再开方,但是不能确定A和B的正负
但是对于无符号数,A不行,这里简单起见,以3bit数为例。
例如A=111,B=110。
C=A+B=001(溢出),D=A-B=001,所以A不能正确恢复了。
C仍然可以,A=C-D=001-110=111。
D答案,同样因为溢出不能恢复。
12. 如果一个二叉树的前序遍历结果是abcdefg,下面哪一个是可能的中序遍历结果?
A. abcdefg
B. gfedcba
C. bcdefga
D. bceadfg
E. bcdaefg
答案:A,B,C,E
A B C E
13. T(n)=1(n<=1),T(n)=25+T(n/5)+n^2,T(n)复杂度是多少?
A. O(nlogn)
B. O(n^2logn)
C. O(n^2)
D. O(n^3)
E. O(n^3logn)
答案:B
还是用主定理吧,直接推的话,好像比较麻烦。
主定理:
主要记住n logba和f(n)的关系,即可,大于为情况1,等于为情况2,小于为情况3.
T(n)=aT(n/b)+f(n)
1) e>0, F(n)=O(n logba-e),复杂度为T(n)=theta(n logba):例如T(n)=9T(n/3)+ n, theta(n2)
2) f(n)=theta(n logba),复杂度为T(n)=theta(n logba*lgn)。
例如:T(n)=25T(n/5)+O(n2),theta(n2lgn)
3) e>0, F(n)=W(n logba+e),复杂度为T(n)=theta(f(n)).例如T(n)=3T(n/4)+cn2,theta(n2)
14. 两个线程运行在双核机器上,每个线程主程序如下,线程1:x=1;r1=y;线程2:y=1;r2=x。
x和y是两个全局变量,初始为0。
以下哪一个是r1和r2的可能值?
A. r1=1,r2=1
B. r1=1,r2=0
C. r1=0,r2=1
D. r1=0,r2=0
答案:A,B,C
考察临界区问题,没有设置临界区,所以可能:
A: x=1 => y=1 => r1=y=1 => r2=x=1
B: y=1 => r2=x=0 => x=1 => r1=y=1
C: x=1 => r1=y=0 => y=1 =>r2=x=1
15. 有n个元素的完全二叉树的深度是:
E. D(n)=log2(n)
F. D(n)=1+log2(n)
G. D(n)=n+log2(n)
H. D(n)=1+n*log2(n)
答案:B
普遍来说,认为根结点深度为1,所以深度=1+ log2(n)
16. 在1,2,3,…999,1000这些数中,一共出现了多少个0?
A. 189
B. 191
C. 193
D. 195
这道题没有答案,正确应该是192,一种数的方法是:1-100有:9+2=11,101-200有:9+9+2=20,之后201-300,…,901-1000模式相同,但1000多1,所以公有11+20*9+1=192。
也可以按照1个零有哪些,2个零有哪些,3个零有哪些这样数,总之有一个比较规律的数的方法,保证没有遗漏就可以了。
17. 2月28日出生和2月29日出生的人的比例是多少?2012年2月28日和2012年2月29日出生的人的比例是多少?
A. 1:1和1:1
B. 4:1和1:1
C. 1:1和4:1
D. 4:1和4:1
答案:B
4:1(四年一次闰年)
1:1(如果闰年,则那年28日和29日出生概率相同,与在其他日期出生概率没有差别)
18. 下面哪些使用的是贪心算法
A. 单源最短路径中的Dijkstra算法
B. 最小生成树的Prim算法
C. 最小生成树的Kruskal算法
D. 计算每对顶点最短路径的Floyd-Warshall算法
E. 字符串匹配中的KMP算法
答案:A,B,C
贪心:Dijkstra,Prim,Kruskal (算法导论中已明确说明)。
Kruskal:初始化每个顶点为只有一个根几点的树,将边的权值按从小到大排序,选择权值最小的边(u,v),如果u和v不在一颗树中,则将u和v所在两棵树合并,边(u,v)加入到集合中,直到所有的边都找完。
Prim:从任意顶点出发,维护一个树A,每一步,选择最小的边连接G(V,A),将结点V加入到树A中,直到所有的顶点都找完。
动态规划:Floyd-Warshall,KMP
19.
Class A{
Public:
Intk1;int k2;
};
一个数组A a[5]={{3,4},{6,5},{2,7},{3,1},{1,2}}
下面哪一个是函数调用之后的结果
{{1,2},{2,7},{3,1},{3,4},{6,5}}
A. f1(a,5,cmp)
B. f2(a,5,cmp)
C. f3(a,5,cmp)
D. f4(a,5,cmp)
E. 以上都不对
答案:A,D
这道题出的很有意思,乍一看,题干这么大,可能会被唬住,其实冷静下来看一下,很简单,就是一个排序的稳定性非稳定性的分析。
所谓稳定性,即:保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同,如果排序的结点仅仅是一个数,则稳定性意义不大,但是如果有多个键值,就需要考虑稳定性的分析。
例如,对于本题,如果排序算法是稳定的,那么因为原数组{3,4}排在{3,1}前,根据稳定性的定义,排序的结果就一定不会出现{3,1}排在{3,4}前的情况。
而如果算法是不稳定的,那么只能说,{3,1}有排在{3,4}前面的可能,需要根据具体的排序过程判断是否相等的值会变换位置。
关于八种算法稳定性的分析,可以查看/shismbwb/item/404c94898cfd2855850fab24。
选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
所以,首先明确四个函数都采用了什么样的排序算法:
f1:选择排序;f2:直接插入排序;f3:冒泡,f4:快排
f2和f3是稳定的,直接pass掉。
然后非稳定的再看是否变换了位置。
A和D如果走一遍程序的话,会发现{3,4}和{3,1}这两个元素是变了顺序的。
对于A答案,a[5]={{3,4},{6,5},{2,7},{3,1},{1,2}}
第一遍排序:{{1,2},{6,5},{2,7},{3,1},{3,4}}
第二遍排序:{{1,2},{2,7},{6,5},{3,1},{3,4}}
第三遍排序:{{1,2},{2,7},{3,1},{6,5},{3,4}}
第四遍排序:{{1,2},{2,7},{3,1},{3,4},{6,5}}
所以正确
对于D答案,a[5]={{3,4},{6,5},{2,7},{3,1},{1,2}}
第一遍排序的运行过程是这样的。
初始:low=0,high=4,i=0,t={3,4}
For循环:
J=1, c({6,5},t)>0,i=0,没有交换(a[i],a[j]),{{3,4},{6,5},{2,7},{3,1},{1,2}}
J=2,c({2,7},t)<0,i=1,交换({6,5},{2,7}),{{3,4},{2,7},{6,5},{3,1},{1,2}}
J=3, c({3,1},t)=0,i=2,交换({6,5},{3,1}),{{3,4},{2,7},{3,1},{6,5},{1,2}}
J=4, c({1,2},t)<0,i=3,交换({6,5},{1,2}),{{3,4},{2,7},{3,1},{1,2},{6,5}}
最后,执行exchange(a,low,i), 交换({3,4},{1,2}),{{1,2},{2,7},{3,1},{3,4},{6,5}}
得到第一遍排序结果:{{1,2},{2,7},{3,1},{3,4},{6,5}},找到了{3,1}的位置,已经在{3,4}的前面,所以最后的结果一定与预期结果相同。
这里需要非常注意的是在_f41函数
中,if(c(a[j],t)<=0),如果写成c(a[j],t)<0的话,则该答案也不会选择。
所以最终的答案是A和D
20.
<word>:: <letter>|<letter><pairlet>|<letter><pairdig>
<pairlet>:: <letter><letter>|<pairlet><letter><letter>
<pairdig>::<digit><digit>|<pairdig><digit><digit>
<letter>::a|b|c|…|y|z
<digit>::0|1|2|…|9
下面哪一个词可以从<word>的规则中产生?Iabcd II bcdef III d22
A. 都不是
B. 只有I和II
C. 只有I和III
D. 只有II和III
E. I和II和III都是
答案:D
算是一道考察形式自动机的题。
关键是分析清楚每种模式本质上代表什么。
<letter>表示单个字母;<digit>表示单个数字;<pairdig>是两个<digit>,或者递归<pairdig>和两个<digit>,其实表示的是偶数个<digit>,即偶数个数字;同理,<pairlet>是偶数个字母。
所以<word>的可能是:1个字母,奇数个字母,或者一个字母和偶数个数字。
所以第二个和第三个是正确的。