2012-10月微软面试题

来源:互联网 发布:c 并行编程 pdf 编辑:程序博客网 时间:2024/05/18 03:06

一面:

1、有两个有序链表(数值有序)。一个链表是递增的,一个链表是递减的。现在将两个链表合并成一个链表,并保证最后的链表是递增的。

2、有一颗二叉树,结点的结构体如下:

strcut node
{
   int value;
   node * left;//左孩子
   node * right;//右孩子
   node * other;//同一层右侧的结点。
}node *;

如何用新的结构体表示的结点表示出二叉树的结构。即同一层的结点,如何从左到右链接起来。

如果允许用多余的空间,怎么做?不能用多余的空间又怎么做?(这道也是优酷的面试题)

二面:

1、检索二叉树(有序二叉树,左孩子的值都比根的值小,右孩子的值都比根的值大),找一个x,判断二叉树上是否有该结点。如果有,则删除。(写代码)

三面:

1、(智力题)一个监狱里,有100名犯人,1名监狱长。监狱长有一个房间,房间里有一盏灯。监狱长每天可随机从100名犯人之间抽一个犯人(可重复)去这个房间,犯人可开灯、关灯,也可以什么都不做。犯人之间不能通信。问题:在监狱长选第一个人进房间之前,100个人需要商量一个对策,保证:在监狱长选犯人的过程中,其中一个人进房间后看了一下,跟监狱长说,这100个犯人都至少进来过一次了。(监狱长选犯人的次数是无限的)

2、现在有一个数组,数组中的数都是自然数(0,1,2,3...),现在这个数组是有序的,要找到第一个不存在的数,如,(1234),则第一个不存在的是0.如:(0134),第一个不存在的是2.现在要找到第一个不存在的数,时间复杂度小于O(n).
如果这个数组是无序的,时间复杂度小于等于O(n),该怎么做?

	
				
		
原创粉丝点击