学习笔记IV——2012 Microsoft Intern Hiring Written Test (2012微软实习生招聘笔试题)

这是网上找到的一套微软笔试题。本人自己做了一下,题解贴在这里。水平有限,错误之处,欢迎拍砖!

首先说一下这套题的评分标准,微软的标准总是很有意思,对于选择题,他们是一定会设法避免有人瞎蒙的!

1~7 全对3分,少选2分,错选-2分

8~18 全对5分,少选3分,错选-3分

19~20 全对12分,少选5分,错选-5分

所有题目不选均是0分。

1Suppose that a selection sort of 80 items has completed 32 iterations of the main loop. How many items are now guaranteed to be in their final spot (never to be moved again)?
A
16 B31 C32 D39 E40

选C

Selection Sort每迭代一次,确定一个元素的位置,迭代32次,自然是确定32个元素。
2
Which synchronization mechanism(s) is/are used to avoid race conditions among processes/threads in operating system?
AMutex BMailbox CSemaphore DLocal procedure call

选AC

用互斥和信号量避免竞争的紊乱。
3
There is a sequence of n numbers 1,2,3,...,n and a stack which can keep m numbers at most. push the n numbers into the stack following the sequence and pop out randomly . Suppose n is 2 and m is 3,the output sequence may be 1,2 or 2,1,so we get 2 different sequences . Suppose n is 7,and m is 5,please choose the output sequence of the stack.
A1,2,3,4,5,6,7
B7,6,5,4,3,2,1
C5,6,4,3,7,2,1
D1,7,6,5,4,3,2
E
3,2,1,7,5,6,4

选AC

A,每入栈一个元素立马拿出即可,由于栈容量为5,所以B不可能,同理,D也不可以,E这种顺序是不可能。C先入栈5个,然后把5出栈,再把6入栈,拿出6,4,3,把7入栈,然后全部出栈。
4
Which is the result of binary number 01011001 after multiplying by 0111001 and adding 1101110?
A
0001010000111111
B
0101011101110011
C
0011010000110101

选A

这种肯定不会直接去算。先看一下乘,乘完之后最后几位正好是0001的形式,所以再加1101110之后最后四位肯定都是1,从而选A。

5What is output if you compile and execute the following c code?

1. void main()

2. {

3. int i = 11;

4. int const *p = &i;

5. p++;

6. printf("%d",*p);

7. }

A11
B
12
CGarbage value
D
Compile error
E
None of above

选C

int const *p表示p指向的对象是不能修改的,但p所指的对象可以变,所以p++之后指向了一个垃圾值。

6Which of following C++ code is correct ?

A

1. int f()

2. {

3. int *a = new int(3);

4. return *a;

5. }

B

1. int *f()

2. {

3. int a[3] = {1,2,3};

4. return a;

5. }

C

1. vector<int> f()

2. {

3. vector<int> v(3);

4. return v;

5. }

 D

1. void f(int *ret)

2. {

3. int a[3] = {1,2,3};

4. ret = a;

5. return ;

6. }

ENone of above

选ABC

A,返回一个int值自然是可以的。B,这种方式是不安全的,因为a的作用域在函数内,函数返回时会释放a的内存,应该尽力避免这样的使用!但是这里不会有语法或者什么编译的问题,不过在多数编译器里会给出warning,提示返回了一个局部变量的地址。如果用int *p = f()调用,当函数结束时,p指向的是一个已经不存在对象的地址,不过输出p[0], p[1], p[2]会得到1,2,3的结果,这是因为虽然对象不存在了,但这几个内存单元还是存着原来的结果。总之,这样的调用不会有语法问题,也可以编译连接运行,但是是非常不安全的!C,这个是正确的,返回vector<int>时,应该是会调用拷贝构造函数(是这样吗?)。

7Given that the 180-degree rotated image of a 5-digit number is another 5-digit number and the difference between the numbers is 78633, what is the original 5-digit number
A
60918 B91086 C18609 D10968 E86901

选D

没什么说的,这个转完之后是89601,正和相差78633

8Which of the following statements are true
AWe can create a binary tree from given inorder and preorder traversal sequences.
B
We can create a binary tree from given preorder and postorder traversal sequences.
CFor an almost sorted array,Insertion sort can be more effective than Quciksort.
DSuppose T(n) is the runtime of resolving a problem with n elements, T(n)=O(1) if n=1;
T(n)=2*T(n/2)+O(n) if n>1; so T(n) is O(nlgn)

E
None of above

选ACD

A,给出中序遍历顺序和先序遍历顺序可以确定一颗二叉树,给出中序遍历顺序和后序遍历顺序也可以确定一棵二叉树,但给出后序和先序却是不可以的。C,QuickSort总是希望数据越乱越好,见 http://blog.csdn.net/stormdpzh/article/details/8718760。D,这个是很明显的,2 * (n / 2)log(n / 2) + n = nlogn
9Which of the following statements are true?
A
Insertion sort and bubble sort are not efficient for large data sets.
BQucik sort makes O(n^2) comparisons in the worst case.
C
There is an array :7,6,5,4,3,2,1. If using selection sort (ascending),the number of swap operations is 6
DHeap sort uses two heap operations:ion and root deletion (插入、堆调整)
E
None of above

选B

见 http://blog.csdn.net/stormdpzh/article/details/8718760。Quick Sort在最坏情况下会退化到O(n^2),不过如果加上随机化等方法,这种退化的可能性是极其小的。
10Assume both x and y are integers,which one of the followings returns the minimum of the two integers?
Ay^((x^y) & -(x<y))
B
y^(x^y)
C
x^(x^y)
D
(x^y)^(y^x)
E
None of above

选A

B的结果是x,C的结果是y,D的结果是0.对于A,分析如下:

if(x >= y) y ^ ((x ^ y) & -(x < y)) = y ^ ((x ^ y) & -0) = y ^ 0 = y = min(x, y);

if(x < y) y ^ ((x ^ y) & -(x < y)) = y ^ ((x ^ y) & -1) = y ^ ((x ^ y) & oxffffffff) = y ^ (x ^ y) = x = min(x, y)
11The Orchid pavilion(兰亭集序) is well known as the top of “行书”in history of Chinese literature. The most fascinating sentence is "Well I know it is a lie to say that life and death is the same thing, and that longevity and early death make no difference Alas!"(固知一死生为虚诞,齐彭殇为妄作).By counting the characters of the whole content (in Chinese version),the result should be 391(including punctuation). For these characters written to a text file,please select the possible file size without any data corrupt.
A
782 bytes in UTF-16 encoding
B
784 bytes in UTF-16 encoding
C
1173 bytes in UTF-8 encoding

D1176 bytes in UTF-8 encoding

ENone of above

选BCD

UTF-16:2 bytes存储一个汉字+2 bytes BOM(Byte Order Marker),共784 bytes

UTF-8:3 bytes存储一个汉字+ 3 bytes BOM或者不加BOM,共1176或1173 bytes

12Fill the blanks inside class definition

1. class Test

2. {

3. public:

4. ____ int a;

5. ____ int b;

6. public:

7. Test::Test(int _a , int _b) : a( _a )

8. {

9. b = _b;

10. }

11. };

12. int Test::b;

13.

14. int main(void)

15. {

16. Test t1(0 , 0) , t2(1 , 1);

17. t1.b = 10;

18. t2.b = 20;

19. printf("%u %u %u %u",t1.a , t1.b , t2.a , t2.b);

20. return 0;

21. }

Running result : 0 20 1 20

Astatic/const

Bconst/static

C--/static

Dconststatic/static

ENone of above

选BC

由int Test::b和运行结果中b的值知b为static修饰。对于a,由于初始化用的是a(_a)的形式,所以可以有const修饰,也可以没有。如果构造函数写成Test::Test(int _a, int _b) {a = _a; b = _b;},则a不可以有const修饰。

13A 3-order B-tree has 2047 key words,what is the maximum height of the tree?
A
11 B12 C13 D14

选A

要使B-tree最高,则假定每个非叶子节点有两个孩子,而且所有的关键字都在叶子上。这样,12层的树可以有2048个关键字。然后删除一个关键字,从下往上依次合并。一个1个孩子的节点和一个2个孩子的节点合并成一个3个孩子的节点。最后,进行到根时,根只有1个孩子了,这时,删除根,高度-1。从而2047个关键字的B-tree最高应该是11层。
14
In C++,which of the following keyword(scan be used on both a variable and a function?
Astatic Bvirtual Cextern Dinline Econst

选ACE

概念。

15What is the result of the following program?

1. char *f(char *str , char ch)

2. {

3. char *it1 = str;

4. char *it2 = str;

5. while(*it2 != '\0')

6. {

7. while(*it2 == ch)

8. {

9. it2++;

10. }

11. *it1++ = *it2++;

12. }

13. return str;

14. }

15.

16. int main(void)

17. {

18. char *a = new char[10];

19. strcpy(a , "abcdcccd");

20. cout<<f(a,\c\);

21. return 0;

22. }

Aabdcccd
B
abdd
C
abcc
Dabddcccd
E
Access violation

选D

读代码。执行时,ab不变,过滤掉c,然后第一个c换成下一个非c字符(d),然后第一个d换成最后一个非c字符(还是d),剩下的字符没有变。从而输出abddcccd。

16Consider the following definition of a recursive function,power,that will perform exponentiation.

[cpp] view plaincopyprint?

1. int power(int b , int e)

2. {

3. if(e == 0)

4. return 1;

5. if(e % 2 == 0)

6. return power(b*b , e/2);

7. else

8. return b * power(b*b , e/2);

9. }

Asymptotically(渐进地) in terms of the exponent e,the number of calls to power that occur as a result of the call power(b,e) is
Alogarithmic
B
linear
C
quadratic
D
exponential

选A

熟悉的话一眼可以看出来,快速幂算法,log级的复杂度!
17
Assume a full deck of cards has 52 cards,2 blacks suits (spade and club) and 2 red suits(diamond and heart). If you are given a full deck,and a half deck(with 1 red suit and 1 black suit),what is the possibility for each one getting 2 red cards if taking 2 cards?
A
1/2 1/2
B
25/102 12/50
C
50/51 24/25
D
25/51 12/25
E
25/51 1/2

选B

第一种情况:(26 * 25) / (52 * 51),第二种情况:(13 * 12) / (26 * 25)
18
There is a stack and a sequence of n numbers(i.e. 1,2,3,...,n), push the n numbers into the stack following the sequence and pop out randomly . How many different sequences of the n numbers we may get? Suppose n is 2 , the output sequence may 1,2 or 2,1, so wo get 2 different sequences .
A
C_2n^n
BC_2n^n - C_2n^(n+1)
C((2n)!)/(n+1)n!n!
D
n!
E
None of above

选B

本人是手动模拟了几个数,然后带进去检验出结果的,鄙视我吧!问了一下yxh和zrw,说是卡特兰数,不会证明。这里找到了一个很好理解的证明:

把入栈记为状态‘1’,出栈记为状态’0‘,那么整个结果对应于n个1和n个0构成的序列,从而总的结果为C(2n, n)。但在这些结果中,是有一部分不符合要求的,具体来说:由于入栈的数一定不能比出栈的数少,所以对所有序列,从前往后扫描,只要遇到某一时刻0的数目比1多,就不符合要求。对于不符合条件的序列,从前往后扫,必然可以在某一个奇数位发现0的数目比1的数目多1,那么对这一位之后的所有数,0和1取反,则得到了一个由n + 1个0和n - 1个0组成的序列,反过来,任意一个n + 1个0和n - 1个1组成的序列,从左向右扫描,必然可以找到一个奇数位,使得0的数目比1的数目多1,也就是说:所有不符合条件的序列是和n + 1个0和n - 1个1组成的序列一一对应的。从而总的不符合条件的序列是C(2n, n - 1) = C(2n, n + 1)。由此得结果为:C(2n, n) - C(2n, n + 1)

19Longest Increasing Subsequence(LIS) means a sequence containing some elements in another sequence by the same order, and the values of elements keeps increasing.
For example, LIS of {2,1,4,2,3,7,4,6} is {1,2,3,4,6}, and its LIS length is 5.
Considering an array with N elements , what is the lowest time and space complexity to get the length of LIS

A
Time : N^2 , Space : N^2
B
Time : N^2 , Space : N
CTime : NlogN , Space : N
D
Time : N , Space : N
E
Time : N , Space : C

选C

目前本人还不知道有O(N)的算法,应该是没有的吧。O(NlogN)的算法是维护一个一位数组,用二分进行优化。之前做过这么一个题目,代码见 http://blog.csdn.net/stormdpzh/article/details/7581324

20What is the output of the following piece of C++ code ?

1. #include<iostream>

2. using namespace std;

3.

4. struct Item

5. {

6. char c;

7. Item *next;

8. };

9.

10. Item *Routine1(Item *x)

11. {

12. Item *prev = NULL,

13. *curr = x;

14. while(curr)

15. {

16. Item *next = curr->next;

17. curr->next = prev;

18. prev = curr;

19. curr = next;

20. }

21. return prev;

22. }

23.

24. void Routine2(Item *x)

25. {

26. Item *curr = x;

27. while(curr)

28. {

29. cout<<curr->c<<" ";

30. curr = curr->next;

31. }

32. }

33.

34.

35. int main(void)

36. {

37. Item *x,

38. d = {\d\ , NULL},

39. c = {\c\ , &d},

40. b = {\b\ , &c},

41. a = {\a\ , &b};

42. x = Routine1( &a );

43. Routine2( x );

44. return 0;

45. }

A、 c b a d
B
、 b a d c
C
、 d b c a
D
、 a b c d
E、 d c b a

选E

很明显,这段代码就是把一个链表逆转然后输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值