# 微软的面试题及答案(09.10.22)

- URL: https://www.yidoo.xyz/microsoft-interview-questions-and-answers-091022
- 作者: 核动力蜗牛
- 发布时间: 2009-10-21
- 更新时间: 2009-10-21
- 分类: 面试题整理
- 标签: 面试题

# 第一组     
　　1.烧一根不均匀的绳，从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子，问如何用烧绳的方法来计时一个小时十五分钟呢? 

　　2.你有一桶果冻，其中有黄色、绿色、红色三种，闭上眼睛抓取同种颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻? 

　　3.如果你有无穷多的水，一个3公升的提捅，一个5公升的提捅，两只提捅形状上下都不均匀，问你如何才能准确称出4公升的水? 

　　4.一个岔路口分别通向诚实国和说谎国。来了两个人，已知一个是诚实国的，另一个是说谎国的。诚实国永远说实话，说谎国永远说谎话。现在你要去说谎国，但不知道应该走哪条路，需要问这两个人。请问应该怎么问? 

　　5.12个球一个天平，现知道只有一个和其它的重量不同，问怎样称才能用三次就找到那个球。13个呢?(注意此题并未说明那个球的重量是轻是重，所以需要仔细考虑) 

　　6.在9个点上画10条直线，要求每条直线上至少有三个点? 

　　7.在一天的24小时之中，时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的? 

　　8.怎么样种植4棵树木，使其中任意两棵树的距离相等? 

# 第二组     

　　1.为什么下水道的盖子是圆的? 

　　2.中国有多少辆汽车? 

　　3.将汽车钥匙插入车门，向哪个方向旋转就可以打开车锁? 

　　4.如果你要去掉中国的34个省(含自治区、直辖市和港澳特区及台湾省)中的任何一个，你会去掉哪一个，为什么? 

　　5.多少个加油站才能满足中国的所有汽车? 

　　6.想象你站在镜子前，请问，为什么镜子中的影象可以颠倒左右，却不能颠倒上下? 

　　7.为什么在任何旅馆里，你打开热水，热水都会瞬间倾泻而出? 

　　8.你怎样将Excel的用法解释给你的奶奶听? 

　　9.你怎样重新改进和设计一个ATM银行自动取款机? 

　　10.如果你不得不重新学习一种新的计算机语言，你打算怎样着手来开始? 

　　11.如果你的生涯规划中打算在5年内受到奖励，那获取该项奖励的动机是什么?观众是谁? 

　　12.如果微软告诉你，我们打算投资五百万美元来启动你的投资计划，你将开始什么样商业计划?为什么? 

　　13.如果你能够将全世界的电脑厂商集合在一个办公室里，然后告诉他们将被强迫做一件事，那件事将是什么?　 

# 第三组     

　　1.你让工人为你工作7天，回报是一根金条，这个金条平分成相连的7段，你必须在每天结束的时候给他们一段金条。如果只允许你两次把金条弄断，你如何给你的工人付费? 

　　2.有一辆火车以每小时15公里的速度离开北京直奔广州，同时另一辆火车每小时20公里的速度从广州开往北京。如果有一只鸟，以30公里每小时的速度和两辆火车同时启动，从北京出发，碰到另一辆车后就向相反的方向返回去飞，就这样依次在两辆火车之间来回地飞，直到两辆火车相遇。请问，这只鸟共飞行了多长的距离? 

　　3.你有四个装药丸的罐子，每个药丸都有一定的重量，被污染的药丸是没被污染的药丸的重量+1。只称量一次，如何判断哪个罐子的药被污染了? 

　　4.门外三个开关分别对应室内三盏灯，线路良好，在门外控制开关时候不能看到室内灯的情况，现在只允许进门一次，确定开关和灯的对应关系? 

　　5.人民币为什么只有1、2、5、10的面值? 

　　6.你有两个罐子以及50个红色弹球和50个蓝色弹球，随机选出一个罐子，   随机选出一个弹球放入罐子，怎么给出红色弹球最大的选中机会?在你的计划里，得到红球的几率是多少? 

　　7.给你两颗6面色子，可以在它们各个面上刻上0-9任意一个数字，要求能够用它们拼出任意一年中的日期数值

　　第四组   

　　第一题   .   五个海盗抢到了100颗宝石，每一颗都一样大小和价值连城。他们决定这么分： 

　　抽签决定自己的号码(1、2、3、4、5) 

　　首先，由1号提出分配方案，然后大家表决，当且仅当超过半数的人同意时，按照他的方案 

　　进行分配，否则将被扔进大海喂鲨鱼 

　　如果1号死后，再由2号提出分配方案，然后剩下的4人进行表决，当且仅当超过半数的人同 

　　意时，按照他的方案进行分配，否则将被扔入大海喂鲨鱼 

　　依此类推 

　　条件：每个海盗都是很聪明的人，都能很理智地做出判断，从而做出选择。 

　　问题：第一个海盗提出怎样的分配方案才能使自己的收益最大化? 

　　第二题   .   一道关于飞机加油的问题，已知： 

　　每个飞机只有一个油箱， 

　　飞机之间可以相互加油(注意是相互，没有加油机) 

　　一箱油可供一架飞机绕地球飞半圈， 

　　问题： 

　　为使至少一架飞机绕地球一圈回到起飞时的飞机场，至少需要出动几架飞机?(所有飞机从同一机场起飞，而且必须安全返回机场，不允许中途降落，中间没有飞机场)第三题.   汽车加油问题     

　　一辆载油500升的汽车从A开往1000公里外的B，已知汽车每公里耗油量为1升，A处有无穷多的油，其他任何地点都没有油，但该车可以在任何地点存放油以备中转，问从A到B最少需要多少油 

　　第四题.   掷杯问题 

　　一种杯子，若在第N层被摔破，则在任何比N高的楼层均会破，若在第M层不破，则在任何比M低的楼层均会破，给你两个这样的杯子，让你在100层高的楼层中测试，要求用最少的测试次数找出恰巧会使杯子破碎的楼层。 

　　第五题.   推理游戏 

　　教授选出两个从2到9的数，把它们的和告诉学生甲，把它们的积告诉学生乙，让他们轮流猜这两个数 

　　甲说：“我猜不出” 

　　乙说：“我猜不出” 

　　甲说：“我猜到了” 

　　乙说：“我也猜到了” 

　　问这两个数是多少 

　　第六题.   病狗问题 

　　一个住宅区内有100户人家，每户人家养一条狗，每天傍晚大家都在同一个地方遛狗。已知这些狗中有一部分病狗，由于某种原因，狗的主人无法判断自己的狗是否是病狗，却能够分辨其他的狗是否有病，现在，上级传来通知，要求住户处决这些病狗，并且不允许指认他人的狗是病狗(就是只能判断自己的)，过了7天之后，所有的病狗都被处决了，问，一共有几只病狗?为什么? 

　　第七题.   U2合唱团在17分钟内得赶到演唱会场，途中必需跨过一座桥，四个人从桥的同一端出发，你得帮助他们到达另一端，天色很暗，而他们只有一只手电筒。一次同时最多可以有两人一起过桥，而过桥的时候必须持有手电筒，所以就得有人把手电筒带来带去，来回桥两端。手电筒是不能用丢的方式来传递的。四个人的步行速度各不同，若两人同行则以较慢者的速度为准。BONO需花1分钟过桥,EDGE需花2分钟过桥,ADAM需花5分钟过桥,LARRY需花10分钟过桥,他们要如何在17分钟内过桥呢? 

　　第八题.   监狱里有100个房间，每个房间内有一囚犯。一天，监狱长说，你们狱房外有一电灯，你们在放风时可以控制这个电灯(熄或亮)。每天只能有一个人出来放风，并且防风是随机的。如果在有限时间内，你们中的某人能对我说：“我敢保证，现在每个人都已经至少放过一次风了。”我就放了你们!问囚犯们要采取什么策略才能被监狱长放掉?如果采用了这种策略，大致多久他们可以被释放? 

# 第五组     

　　1.某手机厂家由于设计失误，有可能造成电池寿命比原来设计的寿命短一半(不是冲放电时间)，解决方案就是免费更换电池或给50元购买该厂家新手机的折换券。请给所有已购买的用户写信告诉解决方案。 

　　2.一高层领导在参观某博物馆时，向博物馆馆员小王要了一块明代的城砖作为纪念，按国家规定，任何人不得将博物馆收藏品变为私有。博物馆馆长需要如何写信给这位领导，将城砖取回。 

　　3.营业员小姐由于工作失误，将2万元的笔记本电脑以1.2万元错卖给李先生，王小姐的经理怎么写信给李先生试图将钱要回来? 

　　4.给你一款新研制的手机，如果你是测试组的组长，你会如何测试? 

　　5.如何为函数int   atoi(const   char   *   pstr)编写测试向量? 

　　第六组     

　　1.链表和数组的区别在哪里? 

　　2.编写实现链表排序的一种算法。说明为什么你会选择用这样的方法? 

　　3.编写实现数组排序的一种算法。说明为什么你会选择用这样的方法? 

　　4.请编写能直接实现char   *   strcpy(char   *   pstrDest,const   char   *   pstrSource)函数功能的代码。 

　　5.编写反转字符串的程序，要求优化速度、优化空间。 

　　6.在链表里如何发现循环链接? 

　　7.给出洗牌的一个算法，并将洗好的牌存储在一个整形数组里。 

　　8.写一个函数，检查字符是否是整数，如果是，返回其整数值。(或者：怎样只用4行代码 

　　9.给出一个函数来输出一个字符串的所有排列。 

　　10.请编写实现void   *   malloc(int)内存分配函数功能一样的代码。 

　　11.给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。 

　　12.怎样编写一个程序，把一个有序整数数组放到二叉树中? 

　　13.怎样从顶部开始逐层打印二叉树结点数据?请编程。 

　　14.怎样把一个链表掉个顺序(也就是反序，注意链表的边界条件并考虑空链表)?   – 

　　15.请编写能直接实现int   atoi(const   char   *   pstr)函数功能的代码 
---
# 答案
第一组题答案：   

　　1)三根绳，第一根点燃两端，第二根点燃一端，第三根不点 

　　第一根绳烧完(30分钟)后，点燃第二根绳的另一端，第二根绳烧完(45分钟)后，点燃第三根绳子两端，第三根绳烧完(1小时15分)后，计时完成 

　　2)根据抽屉原理，4个 

　　3)3升装满;3升-〉5升(全注入);3升装满;3升-〉5升(剩1升);5升倒掉;3升-〉5升(注入1升);3升装满;3升-〉5升;完成(另：可用回溯法编程求解) 

　　4)问其中一人：另外一个人会说哪一条路是通往诚实国的?回答者所指的那条路必然是通往说谎国的。 

　　5)12个球： 

　　第一次：4，4   如果平了： 

　　那么剩下的球中取3放左边,取3个好球放右边，称： 

　　如果左边重，那么取两个球称一下，哪个重哪个是次品，平的话第三个重，是次品，轻的话同理 

　　如果平了，那么剩下一个次品，还可根据需要称出次品比正品轻或者重 

　　如果不平： 

　　那么不妨设左边重右边轻，为了便于说明，将左边4颗称为重球，右边4颗称为轻球，剩下4颗称为好球 

　　取重球2颗，轻球2颗放在左侧，右侧放3颗好球和一颗轻球 

　　如果左边重 

　　称那两颗重球，重的一个次品，平的话右边轻球次品 

　　如果右边重 

　　称左边两颗轻球，轻的一个次品 

　　如果平 

　　称剩下两颗重球，重的一个次品，平的话剩下那颗轻球次品 

　　13个球： 

　　第一次：4，4，如果平了 

　　剩5颗球用上面的方法仍旧能找出次品，只是不能知道次品是重是轻 

　　如果不平，同上　 

6)     

　　o   o   o 

　　o   o   o 

　　o   o   o 

　　7) 

　　23次，因为分针要转24圈，时针才能转1圈，而分针和时针重合两次之间的间隔显然> 1小时，它们有23次重合机会，每次重合中秒针有一次重合机会，所以是23次 

　　重合时间可以对照手表求出，也可列方程求出 

　　8) 

　　在地球表面种树，做一个地球内接的正四面体，内接点即为所求 

　　第二组   无标准答案     

　　第三组   

　　1.   分成1,2,4三段，第一天给1，第二天给2取回1，第3天给1，第4天给4取回1、2，第5天给1，第6天给2取回1，第七天给1 

　　2.   求出火车相遇时间，鸟速乘以时间就是鸟飞行的距离 

　　3.   四个罐子中分别取1,2,3,4颗药丸，称出比正常重多少，即可判断出那个罐子的药被污染 

　　4.   三个开关分别：关，开，开10分钟，然后进屋，暗且凉的为开关1控制的灯，亮的为开关2控制的灯，暗且热的为开关3控制的灯 

　　5.   因为可以用1，2，5，10组合成任何需要的货币值，日常习惯为10进制 

　　6.   题意不理解…*_* 

　　7.   012345   0126(9)78 

　　第四组   都是很难的题目     

　　第一题：97   0   1   2   0   或者   97   0   1   0   2   (提示：可用逆推法求出) 

　　第二题：3架飞机5架次，飞法： 

　　ABC   3架同时起飞，1/8处，C给AB加满油，C返航，1/4处，B给A加满油，B返航，A到达1/2处，C从机场往另一方向起飞，3/4处，C同已经空油箱的A平分剩余油量，同时B从机场起飞，AC到7/8处同B平分剩余油量，刚好3架飞机同时返航。所以是3架飞机5架次。第三题：需要建立数学模型     

　　(提示，严格证明该模型最优比较麻烦，但确实可证，大胆猜想是解题关键) 

　　题目可归结为求数列   an=500/(2n+1)   n=0,1,2,3……的和Sn什么时候大于等于1000,解得n> 6 

　　当n=6时，S6=977.57 

　　所以第一个中转点离起始位置距离为1000-977.57=22.43公里 

　　所以第一次中转之前共耗油   22.43*(2*7+1)=336.50升 

　　此后每次中转耗油500升 

　　所以总耗油量为7*500+336.50=3836.50升 

　　第四题：需要建立数学模型 

　　题目可归结为求自然数列的和S什么时候大于等于100，解得n> 13 

　　第一个杯子可能的投掷楼层分别为：14，27，39，50，60，69，77，84，90，95，99，100 

　　第五题：3和4(可严格证明) 

　　设两个数为n1，n2，n1> =n2，甲听到的数为n=n1+n2，乙听到的数为m=n1*n2 

　　证明n1=3，n2=4是唯一解 

　　证明：要证以上命题为真，不妨先证n=7 

　　1)必要性： 

　　i)   n> 5   是显然的，因为n <4不可能，n=4或者n=5甲都不可能回答不知道 

　　ii)   n> 6   因为如果n=6的话，那么甲虽然不知道(不确定2+4还是3+3)但是无论是2，4还是3，3乙都不可能说不知道(m=8或者m=9的话乙说不知道是没有道理的) 

　　iii)   n <8   因为如果n> =8的话，就可以将n分解成   n=4+x   和   n=6+(x-2)，那么m可以是4x也可以是6(x-2)而4x=6(x-2)的必要条件是x=6即n=10，那样n又可以分解成8+2，所以总之当n> =8时，n至少可以分解成两种不同的合数之和，这样乙说不知道的时候，甲就没有理由马上说知道。 

　　以上证明了必要性 

　　2)充分性 

　　当n=7时，n可以分解成2+5或3+4 

　　显然2+5不符合题意，舍去，容易判断出3+4符合题意，m=12，证毕 

　　于是得到n=7   m=12   n1=3   n2=4是唯一解。第六题：7只(数学归纳法证明)     

　　1)若只有1只病狗，因为病狗主人看不到有其他病狗，必然会知道自己的狗是病狗(前提是一定存在病狗)，所以他会在第一天把病狗处决。 

　　2)设有k只病狗的话，会在第k天被处决，那么，如果有k+1只，病狗的主人只会看到k只病狗，而第k天没有人处决病狗，病狗主人就会在第k+1天知道自己的狗是病狗，于是病狗在第k+1天被处决 

　　3)由1)2)得，若有n只病狗，必然在第n天被处决 

　　第七题：(提示：可用图论方法解决) 

　　BONO&EDGE过(2分)，BONO将手电带回(1分)，ADAM&LARRY过(10分)，EDGE将手电带回(2分)，BONO&EDGE过(2分)   2+1+10+2+2=17分钟 

　　第八题： 

　　约定好一个人作为报告人(可以是第一个放风的人) 

　　规则如下： 

　　1、报告人放风的时候开灯并数开灯次数 

　　2、其他人第一次遇到开着灯放风时，将灯关闭 

　　3、当报告人第100次开灯的时候，去向监狱长报告，要求监狱长放人…… 

　　按照概率大约30年后(10000天)他们可以被释放 

　　第五组无标准答案     

　　第六组部分题参考答案：     

　　4. 

char   *   strcpy(char   *   pstrDest,const   char   *   pstrSource) 
{ 
  assert((pstrDest!=NULL)&&(pstrSource!=NULL));   
  char   *   pstr=pstrDest; 
  while((*(pstrDest++)=*(pstrSource++))!= ‘/0 ‘); 
                return   pstr; 
} 
  

　　5. 

char   *   strrev(char   *   pstr) 
{ 
  assert(pstr!=NULL); 
  
  char   *   p=pstr; 
  char   *   pret=pstr; 
  while(*(p++)!= ‘/0 ‘); 
  p–; 
  char   tmp; 
  while(p> pstr) 
  { 
    tmp=*p; 
    *(p–)=*(pstr); 
    *(pstr++)=tmp;     
  } 
  return   pret; 
  

转自：http://exam.itzero.com/2007/0123/15993_2.html
