整理的微软面试题

来源:互联网 发布:软件开发行业利润率 编辑:程序博客网 时间:2024/05/12 19:16

1.     在排序数组中,找出给定数字的出现次数,比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。

使用二分查找的方法分别找出给定数字的开始和结束位置,最坏情况下时间复杂度为O(logn)。
方法比较直接,不过代码写起来还有些难度。有兴趣的xdjm可以练习一下

2.反序一个单向链表
#include <stdio.h>
typedef struct snode{
char data;
struct snode *next;}node;
node *reserve(node *head){
node *p,*q,*r;
p=head;
q=p->next;
while(q!=null){
r=q->next;
q->next=p;
p=q;
q=r;}
head->next=null;
head=p;
return head;
}

3. 写出正则表达式,从一个字符串中提取链接地址。比如下面字符串中
"IT面试题博客中包含很多  <ahref=http://hi.baidu.com/mianshiti/blog/category/微软面试题> 微软面试题 </a> "则需要提取的地址为 "http://hi.baidu.com/mianshiti/blog/category/微软面试题 "

在python中:
import re
p = re.compile('<a(?: [^>]*)+href=([^ >]*)(?: [^>]*)*>')
content = "IT面试题博客中包含很多 <ahref=http://hi.baidu.com/mianshiti/blog/category/微软面试题> 微软面试题 </a> "
p.search(content).groups()       这段代码对于给出的例子是足够了,但实际情况中还需要考虑链接地址两边的单引号或者双引号,href的大小写,情况会稍微复杂些。

另外,如果面试者对正则表达式完全没有概念,可以和面试官申请换一道题,一般不会有太大影响。

4. 编程实现两个正整数的除法,当然不能用除法操作符。

div3(int a ,int b)

{        intresult= 0;

 

         while(a>=b)

         {

                   result++;

                   a= a-b;

         }

         returnresult;

}//这种方法当a很大,b很小时效率很低。

或者:

int div(const int x, const int y) {
int left_num = x;
int result = 0;
while (left_num >= y) {
    int multi = 1;
    while (y * multi <= (left_num >> 1))

 {
       multi = multi << 1;
    }
    result += multi;
    left_num -= y * multi;
}
return result;
}

5.写程序找出二叉树的深度

一个树的深度等于max(左子树深度,右子树深度)+1。可以使用递归实现。假设节点为定义为
struct Node

{
    Node* left;
    Node* right;
};
int GetDepth(Node* root)

{
    if (NULL == root)

    {
    return 0;
    }
    int left_depth = GetDepth(root->left);
    int right_depth =GetDepth(root->right);
    return left_depth >right_depth ? left_depth + 1 : right_depth + 1;
}

6. 利用天平砝码,三次将140克的盐 分成50、90克两份?

法一:

第一次:同时用2,7砝码称出9克;
第二次:用砝码7和9克盐称出16克盐,此时得盐25克
第三次:用这25克盐称出另外的25克,所以三次之后称出了50克盐剩下了就只有90克

法二:

1.利用天平将140克分成70,70克两份。
2. 利用天平将70克分成35,35克两份。
3. 利用天平和砝码将35克分成20,15两份( 20盐 + 2砝码 = 15盐 + 7砝码)。
得到70+20=90克,和35+15=50克两份。。

7.站在地球上的某一点,向南走一公里,然后向东走一公里,最后向北走一公里,回到了原点。地球上有多少个满足这样条件的点?

在地球表面上,南北走向是沿着经度方向,东西是沿着纬度方向。如果你一直往北走就会达到北极点,往南走就到了南极点。因此,向南走一公里,然后向东走一公里,最后向北走一公里,回到了原点,一种情况就是,出发点是在北极点,这样向南走一公里,然后向东走任意几公里,最后向北走一公里,最后都会回到北极点;
其次,可以这么认为如果从A点向南走一公里到达B点,那么若向东走一公里能回到B,那么最后向北走一公里,就能回到了原点A。这样就可以先找出在南北极点附近找出绕一周只有1公里的圈,那么这个圈落在南极附近时,只要往北推1公里,此时该圈上的点都能满足;若这个圈落在北极附近时,能不能往北推1公里我就不分析了。反正在南极附近能找到任意多个点就能回到这个问题了

8. 有三个水果篮。其中一个里面只有苹果,一个里面只有橘子,另外一个既有苹果又有橘子。每个水果篮上都有标签,但标签都是错的。如何检查某个水果篮中的一个水果,然后正确标注每个水果篮?

从标注成既有苹果也有橘子的水果篮中选取一个进行检查。
如果是橘子,则此篮中只有橘子;标有橘子的水果篮中只有苹果;标有苹果的水果篮中既有苹果也有橘子。
如果是苹果,则此篮中只有苹果;标有苹果的水果篮中只有橘子;标有橘子的水果篮中既有苹果也有橘子。

9. 不利用浮点运算,在屏幕上画一个圆 (x**2 + y**2 = r**2,其中 r 为正整数)。

考虑到圆的对称性,我们只需考虑第一象限即可。
等价于找到一条连接点(0,r)到点(r,0)的一条曲线,曲线上的点距圆心(0,0)的距离最接近 r。
我们可以从点(0,r)开始,搜索右(1,r),下(0,r-1),右下(1,r-1)三个点到圆心的距离,选择距圆心距离最接近 r 的点作为下一个点。反复进行这种运算,直至到达点(r,0)。
由于不能利用浮点运算,所以距离的比较只能在距离平方的基础上进行。也就是比较 x**2+ y**2 和 r**2之间的差值。

10. 将一个句子按单词反序。比如 “hi baidu com mianshiti”,反序后变为 “mianshiti com baidu hi”。

可以分两步走:
第一步按找字母反序,“hi baidu commianshiti” 变为 “itihsnaim moc udiab ih”。第二部将每个单词中的字母反序,“itihsnaim moc udiab ih” 变成 “mianshiticom baidu hi”。

这个方法可以在原字符串上进行,只需要几个整数变量来保持指针即可,空间复杂度低。

11. 计算n bit的整数中有多少bit 为1

方法1:
让此整数除以2,如果余数为1,说明最后一位是1,统计值加1。
将除得的结果进行上面运算,直到结果为0。

方法2:
考虑除法复杂度有些高,可以使用移位操作代替除法。将 x 和 1 进行按位与操作(x&1),如果结果为1,说明最后一位是1,统计值加1。将x 向右一位(x >> 1),重复上面过程,直到移位后结果为0。

方法3:
如果需要统计很多数字,并且内存足够大,可以考虑将每个数对应的bit为1的数量记录下来,这样每次计算只是一次查找操作。

方法四:

int n = 0;while (x)
{   x = x & (x - 1);
   n++;}
return n; //这个方法效率最高,每次清楚x的一位1

12. 快速求取一个整数的7倍

乘法相对比较慢,所以快速的方法就是将这个乘法转换成加减法和移位操作。
可以将此整数先左移三位(×8)然后再减去原值:(X << 3)- X。

13. 判断一个数是不是2的n次幂

return (x&(x-1) == 0) 上题计算n bit的整数中有多少bit 为1的特例。注意1是任何数的0次幂。

14. 在三角形的三个顶点上各有一只蚂蚁,它们向另一个顶点运动,目标随机(可能为另外两个顶点的任意一个)。问三只蚂蚁不相撞的概率是多少?

如果蚂蚁顺时针爬行记为0,逆时针爬行记为1。那么三只蚂蚁的状态可能为000,001,...,110,111中的任意一个,且为每种状态的概率相等。在这8种状态中,只有000和111可以避免相撞,所以蚂蚁不相撞的概率是1/4。

题目的一些扩展:
1. 如果将三角形变成正方形,并且有四只蚂蚁,那么不相撞的概率是多少?(1/8)

 

15给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)

方法1.
对数组进行排序(快速,堆),然后比较相邻的元素是否相同。
时间复杂度为O(nlogn),空间复杂度为O(1)。

方法2.
使用bitmap方法。
定义长度为N/8的char数组,每个bit表示对应数字是否出现过。遍历数组,使用 bitmap对数字是否出现进行统计。
时间复杂度为O(n),空间复杂度为O(n)。

方法3.
遍历数组,假设第 i 个位置的数字为 j ,则通过交换将 j 换到下标为 j 的位置上。直到所有数字都出现在自己对应的下标处,或发生了冲突。
时间复杂度为O(n),空间复杂度为O(1)。

16. 一块长方形的蛋糕,其中有一个小长方形的空洞(角度任意)。使用一把直刀,如何一刀将蛋糕切成相等的两份?

通过长方形中心的的任意直线都能将长方形等分,所以连接两个长方形的中心点的直线可以等分这个蛋糕。

17. 一个没有排序的链表,比如list={a,l,x,b,e,f,f,e,a,g,h,b,m},请去掉重复项,并保留原顺序,以上链表去掉重复项后为newlist={a,l,x,b,e,f,g,h,m},请写出一个高效算法(时间比空间更重要)。

建立一个hash_map,key为链表中已经遍历的节点内容,开始时为空。
从头开始遍历链表中的节点:
- 如果节点内容已经在hash_map中存在,则删除此节点,继续向后遍历;
- 如果节点内容不在hash_map中,则保留此节点,将节点内容添加到hash_map中,继续向后遍历。

18. 小明一家过一座桥,过桥时是黑夜,所以必须有灯。现在小明过桥要1秒,小明的弟弟要3秒,小明的爸爸要6秒,小明的妈妈要8秒,小明的爷爷要12秒。每次此桥最多可过两人,而过桥的速度依过桥最慢者而定,而且灯在点燃后30秒就会熄灭。问:小明一家如何过桥?()

小明与弟弟过去,小明回来,用4s;
妈妈与爷爷过去,弟弟回来,用15s;
小明与弟弟过去,小明回来,用4s;
小明与爸爸过去,用6s;
总共用29s。

19. 编一个程序求质数的和,例如F(7) = 2+3+5+7+11+13+17=58。

方法1:
对于从2开始的递增整数n进行如下操作:
用 [2,n-1] 中的数依次去除n,如果余数为0,则说明n不是质数;如果所有余数都不是0,则说明n是质数,对其进行加和。

空间复杂度为O(1),时间复杂度为O(n^2),其中n为需要找到的最大质数值(例子对应的值为17)。

方法2:
可以维护一个质数序列,这样当需要判断一个数是否是质数时,只需判断是否能被比自己小的质数整除即可。对于从2开始的递增整数n进行如下操作:
用 [2,n-1] 中的质数(2,3,5,7,开始时此序列为空)依次去除n,如果余数为0,则说明n不是质数;如果所有余数都不是0,则说明n是质数,将此质数加入质数序列,并对其进行加和。

空间复杂度为O(m),时间复杂度为O(mn),其中m为质数的个数(例子对应的值为7),n为需要找到的最大质数值(例子对应的值为17)。

方法3:
也可以不用除法,而用加法。申请一个足够大的空间,每个bit对应一个整数,开始将所有的bit都初始化为0。对于已知的质数(开始时只有2),将此质数所有的倍数对应的bit都改为1,那么最小的值为0的bit对应的数就是一个质数。对新获得的质数的倍数也进行标注。对这样获得的质数序列累加就可以获得质数和。

空间复杂度为O(n),时间负责度为O(n),其中n为需要找到的最大质数值(例子对应的值为17)。

第n个质数多大可以用质数的密度函数估算出来,然后保守增加系数。

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

假设数组Card[0 - 53]中的54个数对应54张牌,从第一张牌(i = 0)开始直到倒数第二张牌(i = 52),每次生成一个[ i, 53]之间的数r,将Card[i]和Card[r]中的数互换。

21两个单向链表,可能存在公共节点。如何判断是否存在公共节点,并找出它们的第一个公共结点。

    如果两个单向链表有公共节点,则两个链表会构成Y型结构,最后一个节点相同。我们可以从头开始遍历两个链表,找到最后一个节点的指针,设为p_a,p_b。同时记录下两个链表的长度len_a,len_b(假设len_a >= len_b)。

    如果p_a == p_b,则说明两个链表有公共节点,否则没有。如果有公共节点,则第一个公共节点距起始节点的距离满足 len_a - start_a == len_b - start_b。所以第一个可能的公共节点距起始节点的距离是 len_a - len_b, 0。我们从这两个节点开始比较,直到找到第一个公共节点。

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

从链表的开始处,由两个指针A和B同时开始遍历链表。指针A每向前移动一步,指针B都向前移动两步。如果在移动了N步以后,指针A和B指向了同一个节点,则此链表中存在循环链表。

当然还可以在遍历的过程中存储节点的地址,通过不断的比较地址来判断有没有循环链表。但这种算法会使用更多的内存。
如果考官比较变态,还可以直接考复制链表。如果复制前没有测试循环链表,那不好意思,只能扣分了。

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

最少耗油的要求,先得有几个前提: 1.汽车到达终点时油箱是空的。2.路上的每一个中转点都没有剩下油。

现在画一个数轴,代表起点到终点的路径,在这个数轴上取m个点,分别记为X(1),X(2),...,X(m)。X(i)表示第i个点到终点的距离。1号点为起点,m号点为终点。所以有X(1)=0,X(m)=1000。设汽车油箱的容量为A,由题目可知A=500。设S(i)表示在第i最少存放多少升油,那么显然S(m)=0,而我们要求的就是S(0)。再设n(i)为从第i-1点到第i点需要的往返次数(注意,一去一回代表一次往返)。好,以上就是需要定义的一些符号,

下面开始推导过程:

 从i-1点往i点运油时,最节省的情况是从i-1点出发时应该油箱装满油,然后在i点放下油后回到i-1点时油箱是空的,这时候运油的

效率是最高的。所以有: S(i) = A - [X(i)-X(i-1)] + {A - 2*[X(i) - X(i-1)]}*n(i)。

上式中A - [X(i)-X(i-1)]是最后一次从i-1点到i点油箱中剩下的油;{A - 2*[X(i) - X(i-1)]}*n(i)表示在n(i)次往返过程中总共 在i点存下的油。把上式化简合并一下得到式(1):

S(i) = [n(i) + 1]*A -[2*n(i) + 1]*[X(i) - X(i-1)]      -----(1)

又因为到第i点存下的油等于第i-1点存下的油减去从i-1点到i点的总损耗,而从i-1点到i点的总损耗为[2*n(i) + 1]*[X(i) - X(i-1)],所以有下式:

S(i) = S(i-1) -[2*n(i) + 1]*[X(i) - X(i-1)]。

把(1)式带入上式则可得到式(2-1):

S(i-1) = [n(i) +1]*A   -----(2-1)

同理有式(2-2)

S(i) = [n(i+1) +1]*A  -----(2-2)

 

用(2-1)减去(2-2)得到式(3):

 S(i-1) - S(i) = [n(i) -n(i+1)]*A      -----(3) 

因为S(i-1) - S(i)表示的是从i-1点到i点的总损耗,而A是固定值,所以由(3)式得知,要使总损耗最小,就需要n(i) - n(i+1)最小 

,因为S(i-1) - S(i)必然>0,所以n(i) - n(i+1)>0,且n[i]是整数,所以就有min([n(i) - n(i+1)]) = 1。所以有式(4):

n(i) - n(i+1)= 1==> n(i) = n(i+1) + 1   -----(4) 

把式(4)代入式(2-2)就得到式(5):

S(i) =n(i)*A                          -----(5) 

再把式(5)代入式(1)并化简就可以得到式(6):

X(i) - X(i-1) =A/[2*n(i) + 1]        -----(6) 

X(i) - X(i-1)表示的相邻两点之间的距离,所以显然要达到终点的话就必须有:

 

又因为n(m)=0,即从最后一个中转点到终点是不需要往返的。再由式(4)就有:n(m-1) = 1,n(m-2) = 2, …,即有n(i) = m-i成立。我们从终点往起点回退,再由上式就有:

 

所以求出来m=8。但是m=8时,求出来的和 约等于1010.9比1000大,所以不能由式(5)直接算S(0),而应该先算S(1) = (m-1)*A = (8-1)*500 = 3500升。也就是说在第一个中转点应该要存3500升油。然后再算从第0点到第1点的损耗,由前面的计算我们可以得到X(1) = 1000 – (500 + 500/3 + 500/5 + 500/7 + 500/9 + 500/11 +500/13) ≈ 22.433米。

所以从第0点到第1点的总耗损可以由前面的总损耗公式[2*n(i) + 1]*[X(i) - X(i-1)]求出: [2*n(1) + 1]*(22.433- 0) = (2*7 + 1)*22.433 = 336.495

所以总耗油量就约为 3500 + 336.495 = 3836.495升。

 

 

 

题目可归结为求数列   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升 

24已知(1)每个飞机只有一个油箱;(2)飞机之间可以相互加油(注意是相互,没有加油机) ;(3)一箱油可供一架飞机绕地球飞半圈。那么为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?(所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场)

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架次。

 

 

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

这个题目等价于:已知两个数3和5,可用运算符+和-,要求+和-号的一端必须是3或5,并且中间结果不能大于5。请列出一个结果等于4的表达式。
答案1    4=5 - (3 -(5-3)
答案2    4= 3 - (5 - 3) + 3

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

问“你的国家怎么走?” 他们都会指向诚实国。(如果正确答案只有固定的一边,两个人给出的答案必定不同。只能问对每个人有不同正确答案的问题,比如“你的国家在哪边?”或者“他的国家在哪边”。对应着两个问题,诚实国的人会给出诚实国方向和说谎国方向,说谎国的人也会给出诚实国和说谎国方向。)

        如果题目要求只能问一个人一次问题:就只能问这种“你认为他会告诉我诚实国怎么走?”相当于经过两个人的口来的,一个说真话一个说假话,最终无论这句话问谁都会得出与实际相反的方向。

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

将金条切成1/7,2/7,4/7。
第一天给1/2,第二天给2/7并取回1/7,第三天给1/7,第四天给4/7并取回1/7和2/7,第五天给1/7,第六天给2/7并取回1/7,第七天给1/7。这个题目的关键是要认识到,可以让工人给找零(当然,需要工人有零)。认识到这个问题后,具体的切法就顺利成章的出来了。

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

既然第一步(确定临界段)的投掷数增加不可避免,我们就让第二步(确定临界层)的投掷数随着第一步的次数增加而减少。第一步的投掷数是一次一次增加的,那就让第二步的投掷数一次一次减少。假设第一次投掷的层数是f,转化成数学模型,就是要求f+(f-1)+...+2+1>=99,即f(f+1)/2>=99,解出结果等于14。dp[m,n]为m层 n个杯子 至少要试验的次数,dp[m,n]=min{max{dp[i,n-1],dp[m-i,n-1]}+1}

29.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时1小时15分钟呢?                                             分析我们可以通过绳子对时间进行什么样的操作: 1)通过点燃绳子两端,可以获得二分之一的时间。2)当一只绳子燃烧完后,点燃另外一根绳子,可以对时间进行加法。3)同时点燃两根绳子,可以获得两根绳子燃烧结束的时间差,也就是对时间进行减法。也就是说,通过燃烧绳子,我们可以对时间进行除2,加分和减法操作。为了获得1小时15分钟,我们可以进行如下运算(以分钟计):
60/2 +(60 - 60/2)/2 + 60 / 2 (对应于上面答案中的解释)
(60 - 60/2)/2 + 60
60/2/2 + 60

30.你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻? 根据抽屉原理,4个

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

32.7.在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的? 23次,因为分针要转24圈,时针才能转1圈,而分针和时针重合两次之间的间隔显然> 1小时,它们有23次重合机会,每次重合中秒针有一次重合机会,所以是23次

33.怎么样种植4棵树木,使其中任意两棵树的距离相等? 在地球表面种树,做一个地球内接的正四面体,内接点即为所求

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

35.你有四个装药丸的罐子,每个药丸都有一定的重量,被污染的药丸是没被污染的药丸的重量+1。只称量一次,如何判断哪个罐子的药被污染了? 四个罐子中分别取1,2,3,4颗药丸,称出比正常重多少,即可判断出那个罐子的药被污染 

36.门外三个开关分别对应室内三盏灯,线路良好,在门外控制开关时候不能看到室内灯的情况,现在只允许进门一次,确定开关和灯的对应关系? 三个开关分别:关,开,开10分钟,然后进屋,暗且凉的为开关1控制的灯,亮的为开关2控制的灯,暗且热的为开关3控制的灯 

37.人民币为什么只有1、2、5、10的面值? 因为若用1.2.5.10就能以最少的加减组成另一些数,如1+2=3 2+2=4.1+5=6.2+5=7.10-2=8.10-1=9 如果将这四个'重要数'38.有两个罐子,红蓝球各50个,随机选出一个罐子随机选一个球,怎么给红球最大的选中率?得到红球的准确几率    一个罐子放一个红球,另一个罐子放49个红球和50个篮球。
39.给你两颗6面色子,可以在它们各个面上刻上0-9任意一个数字,要求能够用它们拼出任意一年中的日期数值 012345 0126(9)78 

40.教授选出两个从2到9的数,把它们的和告诉学生甲,把它们的积告诉学生乙,让他们轮流猜这两个数   甲说:“我猜不出”   乙说:“我猜不出”   甲说:“我猜到了”   乙说:“我也猜到了”   问这两个数是多少 

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是唯一解。

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

7只(数学归纳法证明)     
  1)若只有1只病狗,因为病狗主人看不到有其他病狗,必然会知道自己的狗是病狗(前提是一定存在病狗),所以他会在第一天把病狗处决。
  2)设有k只病狗的话,会在第k天被处决,那么,如果有k+1只,病狗的主人只会看到k只病狗,而第k天没有人处决病狗,病狗主人就会在第k+1天知道自己的狗是病狗,于是病狗在第k+1天被处决 
  3)由1)2)得,若有n只病狗,必然在第n天被处决 

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

约定好一个人作为报告人(可以是第一个放风的人)   规则如下: 
  1、报告人放风的时候开灯并数开灯次数 
  2、其他人第一次遇到开着灯放风时,将灯关闭 
  3、当报告人第100次开灯的时候,去向监狱长报告,要求监狱长放人...... 

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

说明:都是网上找的,就当练练脑子,其实没有很大作用,本人面过一个MSRA,问到上面题的概率不是没有,但是很小;主要还是问一些数据结构基础知识和灵活应用,简历上的项目经验,还有自己对应聘职位的理解,还是主要靠平时的积累吧。



原创粉丝点击