2009年微软清华笔试笔经
第一部分 Basics 应该是常识题。
一些 Threads,Memory Manager, HTTP session ,OSI&HTTP,Heap&Stack,BTree,Sorting
Algorithm 等等。这部分我答的很菜因为没有复习且荒于时间估计要覆没了,基本的内容
还是操作系统和数据结构
第二部分
Reasoning 和以前GRE 的Analitical 很像有组题 也有单题
做的还算比较爽
第三部分 Programming
一道题
一个单向链表 给出 链表头pHead 和另一个链表中位置pStartNode,要把它转化为以
pStartNode 为头的链表,但元素链接方向相反了
例如
p1->p2->p3->p4->p5->null pHead=p1;pStartNode=p3
转换后变成了 p3->p2->p1->p5->p4->null;
我也rush 的写完了
第四部分 Design
给了一个 Outlook2003 的图,要求你给新的Outlook 提建议和新的feature
第五部分 Testing
一个是要测试一个一堆矩阵的重合区域的程序,找bug 并提供测试例子。
另一个是给 字符串拷贝 strcpy 找测试例子
总的来说 卷子不算很难还是比较基本的 不过 Basics 之类的题可能还是要把一些基础
课稍微复习复习。不过我因为少答了一个小时所以只能充当分母了,不过去玩玩 ms 的题
还是挺有意思的题出的还是比较不错的虽然我很多不会做。
2010年9月26日微软笔试题 收藏
一、选择题(10个,答对得4分,不答得0分,答错得-1分)
Question 1
合并两个已排好序的数组在最坏情况下需要比较多少次?
(A)2n (B)2n-1 (C)2n+1 (D)2n-2 (E)None of above
Question 2
Question 3
Question 4
Question 5
Question 6
Question 7
#include
#include
int main()
{
char a[] = "Hello World";
char *b = "byebye";
strncpy(a, b, strlen(b));
printf("%s\n", a);
return 0;
}
Question 8
binary search tree
Question 9
C程序,读程序写出结果。
Question 10
看程序写出结果:
#include
#include
class Base
{
protected:
int m_value;
public:
Base(){
m_value = 0;
}
virtual int getValue(){
return --m_value;
}
};
class Derived:public Base
{
public:
virtual int getValue(){
return ++m_value;
}
};
int main()
{
Derived *pDerived = new Derived();
Base *pBase = pDerived;
Base &base = *pBase;
pDerived->getValue();
pBase->getValue();
base.getValue();
printf("%d,", pDerived->getValue());
printf("%d,", pBase->getValue());
printf("%d\n", base.getValue());
return 0;
}
二、编程题
一个rotated sorted array是一个在某处交换了元素的sorted array,例如,rotated sorted array[13, 27, 37, 2, 3, 5]是从sorted array[2, 3, 5, 13, 27, 37]变换而来的,这个sorted array是以增序排好序的。
现在需要计算给定值在rotated sorted array中的索引。例如,27在rotated sorted array[13, 27, 37, 2, 3, 5]中的索引是2。注意:如果想得满分,程序的时间复杂度需要小于O(n)。
参考答案(仅供参考):
一、(1)B
(2)
(3)
(4)
(5)
(6)
(7)byebyeWorld
(8)
(9)
(10)4,5,6
二、
2010.4.24笔试
编程题
一个文件中有多行信息,每一行信息中,第一个为一个key,后面用空格间隔若干symbol,例如:
B A C D E(每一行中的一个symbol至多出现一次,且不与key重复),表示B<A B<C B<D B<E关联。
若一行中只有一个值,如
C
则表示无关联。
现在求写出一个算法,判断一个文件下的所有行中所包含的关联,能否囊括所有元素的关联,使之形成一个sort链,达到例如:A<B<C<D的效果。
例1
input:
A B C
B C
C
(means:A<B A<C B<C)
output:
It can be sorted determine.
例2
input:
A B
B A
C
(means:A<B B<A)
output:
It can't be sorted determine.
例3
input:
A B
A C
C
(means:A<B A<C)
output:
It can't be sorted determine.
2009年微软笔试笔经
赶到考场已经13:45,闲话少数,考试开始了。经过一番没睡午觉后的疲劳作战,考
试结束了。走出考场就像先睡一觉。呵呵不管了,一切听天由命吧。不过,人不能太自私,
总结一下,利己利人吧^_^。
我做的A 卷,这套题共分五部分,依次是Basic,Reasoning,Programming,Design,
Testing。 Basic 好像有11 道题多选题,答对一个加一分,答错一个扣0.5。
有一个是给汇编代码,让选择其功能。最后一个是SQL 题,我不懂,不会:(。别的记
不起来了。
Reasong 部分好像有12 道题。其中前两道题我敢断定是从GRE 上抄来的,可惜GRE 的书
我虽然借了,但是没看。这两道题根本没读懂,也就不说了。后面的题由一个大题组成,分
成好像是10 个小题。
大题题面大意为:现欲举办一场音乐会,组织者准备请四个小提琴家F,G,H,J 和五
个钢琴家R,S,T,W,Z。会议有六天,每天只能有一个人表演,但是有如下限制:
(1) 如果 F 表演,则前三天必须都为小提琴表演;
(2) 如果 J 表演,则必须是在第六天。
(3) 如果 R 表演,则T 必须在第一天表演。
(4) 如果 W 表演,它的前一天和后一天都不能是钢琴表演。
问组织者应如何安排表演?
下边有 10 个小题左右,都是针对可能情况发问的。我随便举一例吧:
下面哪项可能为真?(多选)
A. 如果 F 表演,则W 不可能表演。
B. 如果 R 表演,则W 不可能表演。
C. 如果 J 表演,则F,W 不能同时表演。
D. 如果 W 表演,则S,T 不能同时表演。
声明:此题为我根据印象编制的,反映题目类型。忠告大家:要对付此题有一个绝好的办法:
你去找那个五个小姐,领养五个宠物,穿五种颜色衣服,喜欢吃五种水果那道题。自己推出
那道题,此类问题一概搞定。
Programing 部分有两道大题。
第一题如下:编写一个函数GetGCD,来求一个数组中N 个数的GCD(Greatest Common
Demonitor),即最大公约数。并写出尽可能多的测试用例。
例如 GCD(18,12)=6, GCD(14,35)=7。。。
(1)函数原型如下:int GetGCD(CAryInt & aryInt);
(2)数组访问使用[]操作符,
(3)数组元素个数由CAryInt 的成员函数GetSize 获得。
众所周知,求最两个数大公约数算法为欧几里得算法,求整个数组的最大公约数就可以
先求头两个的,然后求结果和第三个数的最大公约数,依次反复,直到最后,具体算法在此
不赘述。
第二题如下:设计一个数据结构,用来存储一个字典。并写一个函数PrintWord,当要
查询‘ab’时,其输出为所有以ab 开头的单词。此题开始没想到怎么做,后来突然想起可
以用树来存储,我的实现为:将所有相同字母开头的单词组成一个树,这样26 个树组成的
森林即为整个字典。树的每个结点有26 个儿子,分别代表a 到z,然后还要有个字段表示
该结点的字符串,还要有个字段表示该字符串长度,遗憾的事,还应该有个字段表示该结点
是否是单词,可惜我当时没想到,不管啦,听天由命吧。具体算法即结构定义略。
Design 部分一个大题
题目是让你给MSN Messenger 提出新的特性,如果给你三个月时间,你如何改进它?
这个题我自己从用户界面角度编了这么几条(纯属个人意见,不要骂我哦):
(1) 应该有自动隐藏功能,像QQ 那样。
(2) 还应该有留言功能。
(3) 还应该能更换皮肤
(4) 还应该能有MSN Space 的快照,让我方便的看到我朋友的MSN 空间的缩略信息。
Testing 部分有两个大题:
第一题为找bug,改bug 题。给的程序是判断一个单向链表是否含有环的程序,如果有,
返回产生环的第一个结点的指针,否则返回NULL。并写出尽可能多的测试用例 Struct
LinkedList {
LinkedList *pNext;
}
Struct LinkedList *IsCyclicList(struct LinkedList *pHead)
{
Struct LinkedList *pCur, *pStart;
While(pCur){
For(;;){
If(pCur!=pStart)
pStart=pStart->pNext;
}
pCur = pCur->pNext
}
}
这个程序写得实在太烂了,改都不好改。我就简单指出了其几个典型错误,然后就自己
写了一个算法。其典型错误为:链表结构定义的不对,没有数据字段,否则这个链表没任何
意义;指针没初始化;for 循环会陷入死循环。
我给出的算法是
Struct LinkedList {
Int data;
Struct LinkedList *pNext;
}
Struct LinkedList *IsCyclicList(struct LinkedList *pHead)
{
Struct LinkedList *pCur, *pStart;
If (!pHead)
Return NULL;
Else if(!pHead->pNext)
Return NULL;
pCur=pHead;
pStart=pHead->pNext;
While(pStart&&pCur!=pStart){
If(pStart->pNext)
pStart=pStart->pNext->pNext;
else
pStart=NULL;
pCur=pCur->next;
}
Return pStart;
}
我也没仔细推敲,对不对反正就它了。
第二题为:给你一个函数int system(char *command),该函数为command 字符串的命令
解释器,其命令为机器可执行的命令,让你写出尽可能多的测试用例,有多少写多少。
以前经常在往事看前人们的总结,现在也贡献给大家一点,欢迎各位考友补充,希望对
大家有帮助,也顺便纪念我这繁忙而充实的一天^_^。