【转】一些经典的笔试题
【题1】有一幢100层高的大厦,给你两个完全相同的玻璃围棋子。假设从某一层开始,丢下玻璃棋子就会摔碎。那么怎么利用 手中的两颗棋子,用一种什么样的最优策略,知道这个临界的层高呢?
【分析】:先从14楼开始抛第一次;如果没碎,再从27楼抛第二次;如果还没碎,再从39楼抛第三次;如果还没碎,再从50 楼抛第四次;如此,每次间隔的楼层少一层。这样,任何一次抛棋子碎时,都能确保最多抛14次可以找出临界楼层。
=========================================================
【题2】有36匹马,六个跑道?没有记时器等设备,用最少的比赛次数算出跑的最快的前三名马?
【分析】:其实用排除法就可以把过程看的很清楚了,前面的步骤一样,6组分别比之后6个第一名比,这时候,假设排名为:A1、 B1、 C1、 D1、 E1、F1,此时可以断定A1为最快的马,然后排除法,看那些不可能是前三:
1、D,E,F组全部排除;
2、A组后三名全部排除(前面至少已经有A1,A2,A3);
3、B组后四名全部排除(前面至少已经有A1,B1,B2);
4、C组其实后五名都可以排除(前面至少已经有A1,B1,C1);
剩下的就只有:A2、A3、B1、B2、C1,再跑一次ok了
=========================================================
【题3】25匹马,每次比赛可选5匹马赛出次序(无法计时)。问至少要比赛多少次才能确定跑得最快,次快和第三快的三匹马。
【分析】7次。首先分为5组,每组进行一次比赛,然后每组的头一名共五匹马比赛一次。假设第一组快于第二组快于第三组依次。最后一次安排第一组的二三名和第二组的一二名和第三组的第一名。
=========================================================
【题4】A、B、C三个瓶子,A瓶子是空的,B瓶子里有1个白球1个黑球,C瓶子里有1000个白球和1280个黑球。现在蒙着眼睛从C瓶子里取两个球放到A瓶子里。分两个阶段从三个瓶子中摸球(每次摸球后放回再摸下一次),摸到白球赢55000美元,摸到黑球什么也得不到也不损失什么。问为了使两次的收益最大,应该采取什么策略?
算了一下答案应该是两次都在B里面拿。
=========================================================
【题5】
一家中学在每周的最后一天都举行一个惯例活动:学生们来到大厅里站到关闭的抽屉前。吹第一声哨的时候,学生们把每一个抽屉都打开。吹第二声哨的时候,学生们每隔一个关上一个抽屉(抽屉2,4,6,8,10,…)。吹第三声哨的时候,学生们每隔两个开/关抽屉,(开/关的意思是:如果抽屉是开着的,就把它关上;如果抽屉是关着的,就把它打开。他们开/关抽屉3,6,9,12,15…等等。响第四声哨的时候,学生们每隔三个开/关抽屉。响第五声哨的时候,学生每隔四个抽屉开/关抽屉。如此一直进行下去。如果该学校只有100个抽屉。那么当哨声响到100声的时候,站在100号抽屉旁边的学生(而且只有这个学生)开/关了自己的抽屉。请问现在有多少个抽屉是开着的?开着的抽屉的编号是多少?请阐述原因。
首先应该认识到,这个问题会比你想象的要简单的多.做为一到面试题,不可能等你算完100步.因此一定存在一种简化问题的技巧,而且答案也不会过于复杂.要不就是100个抽屉都开着,要不就是没有抽屉开着,要不就是有一种概念模式可以轻松地计算出处于打开状态的抽屉的数量.
例如,我们可以先考虑10个抽屉的情况,看看能不能找出什么规律来.用10个数字表示相应的10个抽屉,每一次动作就在相应的数字下面画一个记号,直到10次开/关行动,这时候应该在10下面画记号.
这之后抽屉的开/关都不会再影响到前10个抽屉.第11次行动只会影响到11,22,33….上面的表只是前10个抽屉的最终状态.既然刚开始的时候抽屉是关着的,因此如果抽屉的开/关次数为奇数,则这个抽屉的最终状态是打开的,如果抽屉的开/关次数是偶数,那么这个抽屉是关着的.
上表中1,4,9号是打开的,而其他是关闭的.而1,4,9都是一个完全平方数,从这里我们可以一窥端倪.
为什么位置为完全平方数的抽屉都是打开的吗?这是因为你每次闭合这个抽屉时,都含有这个抽屉位置数的一个因数.因数成对出现,例如,12,可以表示为1*12,或者2*6或者3*4.既然有3种方法可以把12分解成2个因数,也就是说它有6个因数.也就是说,第12个抽屉要开/关6次.只有当一个抽屉的位置数的因数中有两个因数是相同的,这个位置数所拥有的因数的数量才不会是偶数.例如,9可以分解为1*9和3*3.这样它就只有3个因数(1,3,9).只有位置数为完全平方的抽屉开/关的次数为奇数,这些抽屉的最终状态是打开的.1到100中间的完全平方数有1,4,9,16,25,36,49,64,81,100.因此,以上位置的抽屉是打开的
=========================================================
【题6】网易笔试题
1、飞机起飞时,人会感觉到有一股力压在身上,为什么?施力者是谁?
2、飞机平稳飞行后,你在过道跳起来,会不会撞到飞机尾部?
3、n是一个奇数,求证n(n^2-1)能被24整除
4、两个r进制的数,N和N',它们的位数相同,数字也都相同,只是排序不一样(比如12345和25413)求证N-N'能被r-1整除。
5、为什么使用session?使用session的根本原因是?假如你使用的编程语言没有提供对session的支持,请你使用伪代码实现session机制。请说明在你实现的机制中的安全因素。假如要让你的机制实现多个web服务器前端(几多个机器),你要怎样实现?假如要让你的机制实现勿单点故障点(即一台机器当掉,不影响整个系统的运行),你要怎样实现?
【分析】1 为什么使用session?使用session的根本原因是?
session是为了维持客户端和服务器的会话,实际上就是通过这个机制,来判断当前访问的用户,是上次的那一个?也就是身份的辨认。
2 session的机制和实现
session一般通过cookie或者URL里的一个参数来实现。
第一次访问,产生一个唯一的session编号,然后发送给客户端,比如传递cookie,或者在url里面加上额外的参数
服务器在一个Map里保存此编号对应的信息
用户下一次访问,会再次传递这个编号,服务器在map里查找对应编号的信息是否存在,并进行后面的操作。
3 请说明在你实现的机制中的安全因素。
最关键的,就是sessionid 的生成算法,要足够的随机性,且长度足够长。 除非不得已,不要放在url里面传递
4 多个机器
这个是集群的基础,session至少要在另一个机器上保持同步,也就是这个机器的某个session的任何改变,都要在另一个机器上同时改变。 当然,如果所有机器都改变也行,不过网络流量大了一些毕竟2个机器同时出故障的几率已经很低了。
同步的机制可以用消息的方法进行,比如JMS/UDP等。如果同步有问题,则必须尝试,除非系统只剩下最后一台机器了。
5 故障恢复
因为有至少一个session的备份,所以故障后应立即让备份的机器接管,并继续服务,同时让另外一个机器再次作为备份。
系统如果有管理机,则可以实现简单的故障切换,否则只能每个session进行整个集群的备份了,这样任何一个机器接管都没有问题了。
=========================================================================
【题7】台阶问题
问题描述:楼梯有20阶台阶,上楼可以一步上1阶、2阶或3阶三种走法,计算共有多少种不同的走法。
类似还有:楼梯有10阶台阶,上楼可以一步上1阶、2阶两种走法,计算共有多少种不同的走法。
分析:by 卡西。 f(1)=1,f(2)=2,f(3)=4,f(n)=f(n-1)+2f(n-2)+4f(n-4)
=========================================================================
【程序8】6个桶,装着两种液体,一种液体的价格是另外一种的double,桶容量为8,13,15,17,19,31,有一个美国人,各用了14美元买两种液体,剩下一个桶。问剩下哪个?
分析:by 卡西。 a1+a2+a3=2(a4+a5); 其中a1+a2+a3为偶数,观察得,a1=8.其中,如果剩下的不是31,则,a3=31. 试验得出,a2=17,a4=13,a5=15.所以,剩下19那桶。
=========================================================================
【程序9】囚徒问题
有100个无期徒刑囚徒,被关在100个独立的小房间,互相无法通信。
每天会有一个囚徒被随机地抽出来放风,随机就是说可能被抽到多次。
放风的地方有一盏灯,囚徒可以打开或者关上,除囚徒外,没有别人会去动这个灯。每个人除非出来防风,是看不到这个灯的。
一天,全体囚徒大会,国王大赦,给大家一个机会:如果某一天,某个囚徒能够明确表示,所有的囚徒都已经被放过风了,而且的确如此,那么所有囚徒释放;如果仍有囚徒未被放过风,那么所有的囚徒一起处死!
囚徒大会后给大家20分钟时间讨论,囚徒们能找到方法么?
分析:
解法1:
第一天出来的这个囚徒负责关灯,以后出来的囚徒:
1)当灯是关着的时候,如果他没有开过灯,那他可以打开灯,否则他不能开灯;
2)当灯是开着的时候,他不动灯。
3)第一个囚徒在他放风的时候,如果发现灯是开的,那么他就关闭灯。这时他就把放过风的囚徒数加一。
当第一个囚徒的计数达到99的时候(加上他自己是100),他就可以宣布所有的囚徒都放过风啦,按平均计算100×99=9900天,就是27年呀!
解法2:
第二个方法分两个阶段:
阶段一:前100天决定谁来计数。
1)第1-99天,初始灯关着,第一个两次放过风的人将成为计数者,并将灯关上。设其为第K天第2次放风,则他知道已经有k-1个人放过风,做为100天后计数的初始值。
2)第100天放风的人如果看见等关着,则宣布所有人都放过风;否则把灯关上
阶段二:100天后
1)如果计数者放风看见灯开着,则将放过风的人数加1,到100时宣布胜利
2)其他人如果以前没放过风,并且灯关着,则开灯,否则不动
此方法期望年数为24.42年
解法3:
一个搞笑的解法,从非严格的角度上讲方法是正确的,也应该说效率是最高的,,,,,这个方法就和一个学生拿气压记栓根绳子测量大楼高度是一样的,,,
第一个出去的人,将灯泡砸碎,弄成100个小块,自己拿走一块,,然后每个第一次出来的人拿走一块,当最后一个出来的人,拿走最后一小块的时候,,,,,100个人放风完成,,,,,,而且还有证据,每个人手里一小块玻璃碎片,,,,呵呵,,
=========================================================================
【题10】微软面试题
(1)
一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。
请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。
注意:
- 5个数值允许是乱序的。比如: 8 7 5 0 6
- 0可以通配任意数值。比如:8 7 5 0 6 中的0可以通配成9或者4
- 0可以多次出现。
- 复杂度如果是O(n2)则不得分。
(2)
设计一个算法,找出二叉树上任意两个结点的最近共同父结点。
复杂度如果是O(n2)则不得分。
(3)
一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。
复杂度如果是O(n2)则不得分。
(4)
一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。
复杂度最好是O(n),如果是O(n2)则不得分。
=========================================================================
【题11】出个智力题娱乐下。。。
某县的5所中学举行篮球比赛,每所中学互赛一场举行循环赛。比赛结果如下:“一中:2胜2负;二中:0胜4负;三中:1胜3负;四中:4胜0负”。问5中成绩如何?
【题12】取硬币游戏
l 有两个游戏者:A和B。
l 有21颗硬币。
l 两人轮流取走硬币,每次可取1、2或3颗。
l A先取。
l 取走最后一颗硬币的人获胜,即没有硬币可取的人算输。
【分析】如果剩下1、2或3颗硬币,那么接下来取的人就能获胜;如果剩下4颗,那么无论接下来的人怎么取,都会出现前面这种情况,所以接下来取的人一定会输;如果剩下5、6或7颗硬币,那么接下来取的人只要使得剩下4颗硬币,他就能获胜。0,4,8,12,……都是下一个取硬币者的必败状态。现在有21颗硬币,21除以4的余数是1,所以先走者有必胜的策略,他第一次只要取走1颗硬币,以后每一次都保证剩下的石子是4的倍数就行了。
============================================================
【题13】有10个小球,外形相同,其中一个小球的质量与其他小球不同,给你一个天平,问如何用3次机会把那个小球给找出来,并且求出那个小球比其他的小球是种还是轻?