微软经典面试题及答案

第一组:

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

解析:

     需要3根绳子。

     对于1号绳子,同时点燃两段,2号绳子也在此时点燃,点燃一端。

     当1号绳子燃烧完后,用时30分钟,此时把2号绳子的另一端也点燃。2号绳子燃烧完剩余的需要15分钟。

     过去45分钟,1 2号绳子燃烧完。此时点燃3号绳子的两段。3号绳子燃烧完用时30分钟。

     45+30 = 1小时15分钟

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

解析:

     4个。 有k种,抽屉原理,k+1个必然有两个相同。

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

解析:

     大水桶满水,倒入小水桶3L,此时大水桶剩余2L

     小水桶水倒掉,大水桶的2L倒入小水桶。此时小水桶2L,大水桶0L

     大水桶加满5L水,倒1L入小水桶使小水桶满水。此时大水桶4L,小水桶3L。

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

解析:这道题没有确定的答案,常规思路是确定询问的是诚实人还是说谎人。

        如果岔路口只有两个,可以指着一条路同时问甲乙两人:“你是来自这条道路的?”如果两人都说是,则为诚实道路,如果两人都说不是,则为说谎道路。

        如果有N条岔路,需要判断哪个人是诚实人,然后让诚实人指路。比如问甲:“乙是和你来自于同一个国家的”

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

解析:用已经确定的好球去 交叉验证不同的球。

      12球,分4,4,4.称其中4:4.(如果相同,则在剩余的4个未知球里。此时,选择3个未知球放在左边,从8个好球中选择3个放右边,比较。如果相等,则目标球为剩余的1个未知球。如果左边重,则说明目标球重,再称一次可以从左边3个球中找到目标球。如果左边轻,说明目标球轻,同理可称一次得到目标球。)(如果不相同,则目标球在4:4里,剩下的4个未知球为好球。假设左重右轻,拿2重2轻放左边,3好1轻放右边,比较,(如果相等,则目标球在剩余的2重1轻中,比较2重球,如果相同目标球为1轻球,如果不相同,则目标球为重的。)(如果不同,左边重,称左边2重球,重的为目标球,如果相同,右边轻的为目标球;右边重,称2轻,轻的为目标球))

     13个球,分4,4,5。称其中4:4.如果不同如上,如果相同,目标球在5个球中。取3未知球放左边,3好球右边。如果相同,则取剩下的1未知球与1好球称,若相同,另一未知球为目标球,若不同,此未知球为目标球。如果不相同,左重,则称一次可取出3未知球中重的目标球。左轻,同样。

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

解析:10条直线3个点,共30个点,则每个点需要通过3次或4次。3*6+4*3 = 30

点:    。     。      。

              。  。  。

           。     。      。

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

解析:23次。分钟转24圈,时针转2圈。所以一共重合22次。每次重合,分钟都可以重合一次。

     由于时间是恒定的,两次重合之间的时间是相同的,则每次重合间隔为12/11时。也即11个点组成一个圆内接正11边形,有一个顶点在0点时刻。

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

解析:这道题感觉是考察打破常规思维的。只能在正三棱锥的四个点种树。要构造正三棱锥,一个方法是找个正三棱锥的山,一个方法是求个地球内接正三棱锥的地球表面4个地点种树。


第二组(没有标准答案的思维分析题):

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

1. 不会因哪一边窄一点会掉下去, 
2,运输方便, 可以打滚儿, 
3,节约材料, 相同大的面积, 用更少的材料, 
4,下水道口造成圆的可以减少下水盗盖被偷后不规则物体(自行车、石头等)掉下去的机率。 
5、圆形可以减少下水道盖被偷后行人因打望而掉下去的可能性,因为女人是圆的, 眼珠是圆的, 下水道口也是圆的, 可以减轻眼珠因看其它形状物体而受力不均带来的眼疲劳和身疲劳, 从而降低掉进下水道的可能性

二. 中国有多少辆汽车?估计推算能力。中国13E人口,分大城市、中城市、小城市、农村来计算。

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

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

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

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

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

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

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

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

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

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

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


第三组:

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

解析:找零

     分成1:2:4三段,第一天给1,第二天给2找回1,第三天给1,第四天给4找回1,2,第五天给1,第六天给2找回1,第七天给1.

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

解析:不要局限在来回反复飞上,小鸟的速度为30km/h,飞行时间t=L/45。则总共飞行长度为 30*L/45 = 2*L/3.

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

解析:四个罐子,分别取1,2,3,4个药丸,称总重量相对于正常的10个药丸重多少。则重多少即为那个罐子药被污染了。

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

解析,三个开关分别为:开,开,关,一段时间后,把第一个开关关了。进屋。亮着的灯为第二个开关,暗着且热的灯为第一个开关,暗着且冷的为第二个开关。

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

解析: 可以组合出任意面值。和一题类似。

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

解析:题目意思是,有50个红色球和50分蓝色球,分别放入两个管子里,然后从两个罐子里随机抽取一个球,如何放这100个球可以使得得到红球的概率最大。

假设1 2号罐子,1号罐子里放入x个红球,y个篮球。则2号罐子里有50-x个红球,50-y个篮球。

得到红球的概率为 P(球=红球|罐子=1)+P(球=红球|罐子=2)=(x/(x+y)+(50-x)/(100-x-y))/2 = f(x,y)

即求f(x,y)的最大值,约束条件是0<=x<=50,0<=y<=50.

可以用拉格朗日求解最大值。

由于数量少,我通过程序枚举可以得到最优解:

#include <iostream>
using namespace std;

int main(){
    int x=0,y=0;
    double f=0;
    for(int i=0;i<=50;i++){
        for(int j=0;j<=50;j++){
            if((i==0&&j==0)||(i==50&&j==50))continue;
            else{
                double temp = 1.0*i/(i+j)+1.0*(50-i)/(100-i-j);
                if(f<temp){
                    f=temp;
                    x=i;y=j;
                }
            }
        }
    }
    cout<<x<<" "<<y<<" "<<f/2<<endl;
}

答案为 1  0  0.747  

即一个罐子放1个红球,一个罐子放49个红球和50个篮球。

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

解析:012345    0126(9)78   6可以当9来用。


第四组:

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

  抽签决定自己的号码(1、2、3、4、5) 
  首先,由1号提出分配方案,然后大家表决,当且仅当超过半数的人同意时,按照他的方案进行分配,否则将被扔进大海喂鲨鱼,如果1号死后,再由2号提出分配方案,然后剩下的4人进行表决,当且仅当超过半数的人同意时,按照他的方案进行分配,否则将被扔入大海喂鲨鱼,依此类推 
  条件:每个海盗都是很聪明的人,都能很理智地做出判断,从而做出选择。 

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

解析:

      1号分配时,2号肯定会投反对票,所以1号可以给2号0个。

      如果2号分配,3号肯定会投反对票,此时2号给3号0个。

      如果3号分配,4号肯定投赞成票,因为如果到4号分配,他必死无疑。5号肯定投反对票,此时3号可以 100 0 0 分配。

      因此,如果是2号分配,2号 给 4 号和 5号 每人1个,则4 5号会同意。此时最大利益为 98 0 1 1。

      因此,对于1号分配,拉选票的方法为 给3号 0+1个,选择4 5号中一个,给1+1个,此时最大利益为 97 0 1 2 0 或者 97 0 1 0 2.

二 . 一道关于飞机加油的问题,已知:

  每个飞机只有一个油箱,飞机之间可以相互加油(注意是相互,没有加油机),一箱油可供一架飞机绕地球飞半圈,

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

解析:

      因为是绕圈,所以只要保证一架飞机在1/4处为满有就可以,因为在3/4处,可以出动使得飞机在1/4处满油相同的飞机去接应。

      在1/4处使得满油,需要出动2架飞机去帮助它,共3架飞机。

      在3/4处接应,也需要出动2架飞机,所以共需要出动5架飞机。

三. 飞机直线飞行,n架飞机最远能飞多远。

解析:

      飞得越远,在飞得数量越少。如果有2架飞机,则在油耗的1/3处,第二架飞机需要给第一架飞机加满油然后飞回。如果有3架飞机,第3架飞机要保证2 3飞机能飞回的情况下尽量给1飞机多的油。耗油为路程的5倍。第4架飞机为7倍。于是,n架飞机最远能飞1+1/3+1/5+1/(2n+1)。

       可以用这个思路去解第二题。因为在1/4处需要满油,而(1/3+1/5)/2>1/4,所以2架飞机辅助可以使得1飞机在1/4处满油。

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

解析:

     和飞机直线飞行类似。这里,我们可以得到用1箱油可以把n箱油运送1/(2n+1)的距离。得到an = 500/(2n+1)。对于n箱油,最远的距离是sn=a1+a2+..+an = 500(1+1/3+1/5+...+1/(2n+1))。

      求sn>=1000的最小n,这里n>6.当n=6时,sn = 977.57.

      可以设定第一个中转点在1000-977.57=22.43处。此处需要用第8箱油把前6+1箱满油运送到22.43处且前6+1箱油满油。第8箱油共需要22.43*(2*7+1)=336.50.

       前6+1箱油每箱出发时满油为500;

      共需要最少油 7*500+336.50 = 3836.5

五. 掷纸杯问题

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

解析:

      求自然数列和,1+2+3+..+n>=100,得n=13。选择楼层顺序按照自然数列倒序,14 27 39 50 60 69 77 84 90 95 99 100。这样,可以保证每个划分最坏情况为14次。

      可以用动态规划求解。设dp[i][j]为对于i层楼房,j个杯子,最少需要摔的次数,则。

      dp[i][1] = i;  dp[0][j] = 0; dp[1][j] = 1;

      转移方程为: dp[i][j] = min(1<=k<i)(max(dp[k-1][j-1],dp[i-k][j])+1)。这里对于小于i层的每一层子问题k,先测试1次第k层杯子是否可以摔破,如果摔破,则接下来的次数取dp[k-1][j-1],如果没有破,则接下来取dp[i-k][j]。即max(dp[k-1][j-1],dp[i-k][j])+1。对于所有的子问题1<=k<i得到的dp[i][j],求最小的dp[i][j]。

      代码如下:

#include <iostream>
using namespace std;

const int MAXN = 102;
const int MAXC = 4;
int dp[MAXN][MAXC];

int main(){
    int minD;
    for(int i=0;i<MAXN;i++){
        dp[i][1]=i;
    }
    for(int j=1;j<MAXC;j++)dp[1][j]=1;
    for(int i=2;i<MAXN;i++){
        for(int j=2;j<MAXC;j++){//j从2开始,如果从1开始,则j-1为0无意义
            dp[i][j]=i;
            for(int k=1;k<i;k++){
                minD = max(dp[k-1][j-1],dp[i-k][j])+1;
                dp[i][j] = min(dp[i][j],minD);
            }
        }
    }
    cout<<dp[100][2]<<endl;
}

六. 猜数字

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

解析:根据和积是否唯一来做。由于第一轮甲猜不出,表示重复,和可能为:

      7(2,5;3,4)  8(2,6; 3,5; 4,4)  9 (2,7; 3,6; 4,5) 10(2,8; 3,7; 4,6; 5,5) 11 (2,9; 3,8; 4,7; 5,6)  12(3,9; 4,8; 5,7; 6,6) 13(4,9; 5,8; 6,7) 14(5,9; 6,8; 7,7) 15(6,9; 7,8) 16(7,9; 8,8)

         第二轮乙猜不出,表示积重复,可能为:

      12(2,6; 3,4) 16(2,8; 4,4)  18(2,9; 3,6) 24(3,8; 4,6) 36(4,9; 6,6)

        此时,和只能为:

       2+6 = 8; 3+4 = 7; 2+8 = 10; 4+4 =8;2+9 = 11; 3+6 = 9;  3+8 = 11;4+6 = 10; 4+9 = 13; 6+6 = 12;中的一个

       第三轮甲猜出来了(甲是知道和的),说明和只可能是 3+4 =7, 3+6 = 9, 4+9 = 13, 6+6 = 12;(排除重复和)

       第四轮乙猜出来了(乙是知道积的),说明积只可能是 3*4 = 12, 3*6 = 18(排除重复积).所以答案为3,4 或者3,6.

七. 病狗问题

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

解析:  7只病狗。前提是肯定存在病狗

    如果只有1只病狗,那么病狗主人看不到其他的病狗,则确定自己的为病狗,第一天处决。

    如果有2只病狗,病狗主人看到了另外的1只病狗,不确定自己的是否为病狗,不处决自己的。此时如果只有这么1只,那么第二天将没有病狗,如果自己的也是病狗,第二天他看到的病狗不会被处决。此时病狗主人可以确认自己的是病狗,第二天2只病狗都可以同时处决。

    如果有k只病狗,则第k天同时都处决。

    如果有k+1只病狗,则第k+1只的病狗主人看到的k只病狗应该在第k天处决,如果没有处决,说明他自己的也是病狗,于是在下一天(k+1)处决自己的病狗。

八. 智商题

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

解析:  想了好久没想通,思路是让最慢两个的同时走一次这样可以省去次慢的时间。

     先1分,2分的两人过桥,到时(2分钟)

     1分的回来送手电,到时(3分钟)

      5分,10分的两人过桥,到时(13分钟)

      2分的回来送手电,到时(15分钟)

      1分,2分的两人最后过桥,到时(17分钟)

九. 

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

解析: 目前认为比较靠谱的方法是:

    约定一个报告人。报告人每次放风时,如果灯关着,就把灯亮了。(记录开灯的次数)

    对于其他囚犯,放风时如果第一次遇到灯亮,把灯关掉。

    当报告人记录开灯次数100次时,说明每位囚犯至少放过一次风了。

    这样,大约10000天后可以被释放。


第五组:

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

解析:第一反应是诚实说事实。但是肯定会影响品牌价值。

           查了下众多的参考答案,感觉还是需要抓住消费者心理,把不好的隐藏下来,把问题解决是最好的思路。这样可以一举两得,得到双赢的效果。

           以前太过诚实,是就说是,不是就是原原本本的不是。本质应该是不善思考,不会说话。

           在不扭曲事实的前提下说出可以双赢的话!

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

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

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

解析: 首先罗列出手机的功能,对功能进行单独测试;

            列出功能之间的依赖关系,对功能组合进行测试;

            手机的物理测试,比如抗摔、掉漆等;

            手机的外观设计,受欢迎程度,手感如何,功能键的分布是否合理。这个可以通过试用人数及调查问卷来进行

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

解析:考察分析问题的全面程度;

      1. 正负测试"+""-";   

      2. 小数测试(int型,理想下应该是把合法小数转成整型)  2.1 小数是否合法  2.2 小数是否double越界  2.3小数合法,转成int型是否越界;

      3. int常规型是否越界;

      4. 带e的科学表示法,是否合法  4.1 科学表示法转成int型是否越界

      5. 是否为不符合上4种的 非法字符串。

      6. 空字符串,字符串中有空格,空格位置不同的情况

第六组

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

解析:

    链表可以存储在不连续的空间内,元素通过指针来连接,可以动态的增加减小大小,存储在堆中。通过索引读取元素时间复杂度为O(n),插入删除时间复杂度为O(1)

    数组存储在连续的空间内,必须事先制定大小,不能动态改变大小,静态(非动态分配)数组存储在栈中,自由度高。通过索引读取元素时间复杂度为O(1),插入删除时间复杂度为O(n)。

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

解析:在所有排序算法中,O(nlogn)的归并排序可以用在链表排序中,所以首选归并排序,由于在链表中每次二分需要找到当前链表的中间位置,需要复杂度为O(n),所以在链表排序中,时间复杂度为O(2nlogn),也即O(nlogn).代码入下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *sortList(ListNode *head) {
        if(head==NULL)return NULL;
        int n=0;
        ListNode *p,*q,*hd=NULL,*temp=NULL;
        p = head;
        while(p){
            ++n;
            p = p->next;
        }
        if(n==1)return head;
        p=head;
        int l=n/2;
        for(int i=1;i<=l;++i){
            if(i==l)temp=p;
            p=p->next;
        }
        q=head;
        if(temp)temp->next = NULL;
        q=sortList(q);
        p=sortList(p);
        while(q&&p){
            if(q->val<=p->val){
                if(hd==NULL){
                    hd=temp=q;
                }else{
                    hd->next = q;
                    hd=hd->next;
                }
                q=q->next;
            }else{
                if(hd==NULL){
                    hd=temp=p;
                }else{
                    hd->next = p;
                    hd=hd->next;
                }
                 p=p->next;
            }
        }
        if(q){
            hd->next=q;
        }
        if(p){
            hd->next=p;
        }
        return temp;
    }
};

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

解析:首选快速排序,时间复杂度为O(nlogn)

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

解析:考虑两个字符串内存重叠的情况

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

解析: while(i<j)swap(s[i++],s[j--]);

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

解析:指针追赶。一个指针每次走一步,一个指针每次走两步。同时头节点出发,相遇则有循环。

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

解析:洗牌算法。

     for(int i=M-1;i>=0;i--){

              int index = rand()%(i+1);

              swap(a[i],a[index])

     }

    证明:对于前k个牌,洗好后概率为1/k,放入第k+1个牌,如果它本身不换,概率为1/(k+1),如果它与前k个牌某一个换,概率为p=k/(k+1),此时对于前k个牌,概率为p/k = 1/(k+1)。

八. 写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码编写出一个从字符串到长整型的函数)

解析:   int charToInt(char *c){

                       if(c>='0'&&c<='9')return c-'0';

              }

              int strToInt(char* str,int len){//合理利用递归来减少代码量

                       if(len>1){

                           return str[0]=='-'?(strToInt(str,len-1)*10-(str[len-1]-'0')):(strToInt(str,len-1)*10+(str[len-1]-'0'));

                       }else{

                           return str[0]=='-'?0:str[0]-'0';

                       }

              }

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

解析:递归

void printAll(string s,int index){
    if(index == s.length()-1){
        cout<<s<<endl;
    }else{
        for(int i=index;i<s.length();i++){
            swap(s[i],s[index]);
            printAll(s, index+1);
            swap(s[i],s[index]);
        }
    }
}

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

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

解析:复制两个字符串A和B到C,其中A的后几个字节和B的前几个字节相同,相同的字节到C只需要复制一次。

       首先需要找到A的后L个字节和B的前L个字节重叠,然后把A复制到C,把B从第L+1个字节开始复制到C之后。

      可以从B的尾部开始向前遍历,来找寻最长的前L个字节与A的后L个字节相同。然后复制。

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

解析:二分,从中间截断,A[mid]为二叉树的根,A[left]到A[mid-1]为二叉树的左子树,A[mid+1]到A[right]为二叉树的右子树。

         递归求左右子树。

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

解析: BFS,设定两个数组pre[],cur[],轮流记录当前和前一层节点。

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

解析: 注意边界条件,及空链表。

十五. 请编写能直接实现int atoi(const char * pstr)函数功能的代码

解析:比较复杂,需要把各种情况考虑到。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网上有不少Microsoft的测试题,引来不少的眼光。在这里把所有的测试题加以整理,再附上答案。(个别题答案有多种,文本仅代表作者的思路)每道题的后面会给出一个时间。这个时间是作者做出该题所用的时间。(注意,这不是什么标准时间,相信所有浏览本试卷的朋友都会在某一道或多道题上找到灵感,迅速解题的) 一.最基本题型(说明:此类题型比较简单) 1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?(这道题我当初想了一个小时) 2.你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻?(5秒-1分钟) 3.如果你有无穷多的水,一个3公升的提捅,一个5公升的提捅,两只提捅形状上下都不均匀,问你如何才能准确称出4公升的水?(40秒-3分钟) 4.一个岔路口分别通向诚实国和说谎国。来了两个人,已知一个是诚实国的,另一个是说谎国的。诚实国永远说实话,说谎国永远说谎话。现在你要去说谎国,但不知道应该走哪条路,需要问这两个人。请问应该怎么问?(20秒-2分钟) 5.12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。13个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑)(5分钟-1小时) 6.在9个点上画10条直线,要求每条直线上至少有三个点?(3分钟-20分钟) 7.在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的?(5分钟-15分钟) 二.没有答案型(说明:这些题显然不是考你智力。而考的是你的反应能力。这种题大多数没有答案,但是要看你的反应喽!)
以下是一些可能出现的.NET Core微服务面试题答案: 1. 什么是微服务架构?微服务架构有哪些优缺点? 答:微服务架构是一种将应用程序拆分成多个较小、独立的服务的架构。每个服务都有自己的业务逻辑和数据存储,可以独立部署和扩展。微服务架构的优点包括:高可用性、高可扩展性、易于维护和更新、更好的团队协作和快速开发;缺点包括:复杂性、部署和测试的挑战、需要额外的管理和监控。 2. .NET Core与微服务架构有什么关系? 答:.NET Core是微软开发的跨平台开发框架,可以用于构建微服务架构。.NET Core提供了许多工具和库,使得在.NET Core中实现微服务变得更加容易和高效。 3. 请简述一下如何在.NET Core中实现微服务架构? 答:在.NET Core中实现微服务架构需要遵循以下步骤: 1)拆分应用程序,将业务逻辑和数据存储拆分成多个服务; 2)选择适当的微服务框架,如ASP.NET Core、Service Fabric、Dapr等; 3)实现服务之间的通信,可以使用HTTP、TCP、Message Queue等协议和工具; 4)实现服务注册和发现,可以使用Consul、Eureka、Zookeeper等工具; 5)实现负载均衡和容错机制,可以使用Ribbon、Hystrix等工具。 4. 请列举.NET Core中常用的微服务框架? 答:ASP.NET Core、Service Fabric、Dapr、Steeltoe等都是.NET Core中常用的微服务框架。 5. 如何在微服务架构中实现服务发现和负载均衡? 答:可以使用Consul、Eureka、Zookeeper等工具来实现服务注册和发现,使用Ribbon、Hystrix等工具来实现负载均衡和容错机制。 6. 如何在微服务架构中实现服务容错和故障恢复? 答:可以使用Hystrix、Polly等库来实现服务容错和故障恢复。这些库提供了诸如断路器、超时、重试等功能,可以帮助应用程序处理各种故障情况。 7. 请说明.NET Core中的服务注册与发现的实现方式? 答:.NET Core中可以使用Consul、Eureka、Zookeeper等工具来实现服务注册和发现。这些工具可以将服务的网络地址和元数据注册到中央服务注册表中,其他服务可以通过查询这个注册表来发现需要调用的服务。 8. 请说明如何使用.NET Core实现微服务架构中的认证和授权? 答:可以使用IdentityServer4、OpenID Connect等库来实现微服务架构中的认证和授权。这些库提供了诸如OAuth2、JWT等功能,可以帮助应用程序实现安全的身份验证和授权。 9. 请简述一下如何在.NET Core中实现微服务之间的通信? 答:可以使用HTTP、TCP、Message Queue等协议和工具来实现微服务之间的通信。在.NET Core中,可以使用HttpClient、gRPC、RabbitMQ等工具来实现微服务之间的通信。 10. 如何在.NET Core中实现微服务架构中的API网关? 答:可以使用Ocelot、Zuul等库来实现微服务架构中的API网关。这些库可以将微服务的API聚合在一起,提供统一的入口点和路由策略,以便于管理和监控微服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值