位置: 首页 - 职场资讯 - 职业规划 - 初入职场 - 详情

腾讯08年招聘面试题(以狗试毒)zz

2009年08月29日 | 查看: 502次 | 字号: [] [] []

昨天同学发过来一道思考题(下面的第1题),令我受益良多。

1、1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒)。

下面的2-8题仅作存档用,没有仔细研究。

2、找规律填字母
   Z H A
   M E ( )

  A. K
   B. Y
   C. B
   D. W

3、网站上的媒体资源(图片、音频、视频等)很容易被盗链,相对比较安全的防范措施是:()
   A.检查refer
   B.为资源文件添加数字签名
   C.添加基于session的判断
   D.以上说法都正确

4、使用视频软件进行聊天时,视频数据几乎都通过udp协议传输。关于udp协议,下列说法错误的是______
   A.数据通过udp协议传输存在丢包的可能,安全性不如tcp协议
   B.udp协议传输执行速度比tcp快
   C.udp协议的数据传输是无序的,tcp协议的数据传输是有序的。
   D.视频、聊天、邮件等数据的传输都可以使用udp协议。

5、局域网甲内的主机A开启了p2p下载工具(如bt,emule等),他如何同局域网乙中的主机B建立连接______
   A.通过主机B的内网ip建立连接
   B.通过主机B的物理地址建立连接
   C.通过NAT穿越技术建立连接
   D.无法建立连接

6、Windows将遵循下面的那种搜索来定位DLL()
   1.进程的当前工作目录
   2.包含EXE文件的目录
   3.列在Path环境变量中的一系列目录
   4.Windows系统目录
   5.Windows目录

  A 12453 B 12543 C 21453 D 21345

7、设有一个递归算法如下
   int x(int n)
   {
   if(n <=3) return 1;
   else return x(n-2)+x(n-4)+1;
   }
  试问计算x(x(8))时需要计算______次x函数。
  至少列举5种windows下进程间通讯的方式

8、不用中间变量,实现strlen函数。(strlen为C语言中求给字符串长度库函数)
   int strlen(const char *str)

-=================================================================-

由于同学发过来的是第1题,所以其他的我也就没仔细看,不过即使仔细看了肯定也等于白看。

在没找答案之前,老王进行了一段分析。因为以前也见到过类似的考题,它们无一例外地有一个绝妙的答案,所以我想这个也是这样。

由题可知:由于20小时后才能知道小狗是否中毒,而且中毒的时间其实是无法精确到某一具体时间点或较短时间段的,所以每隔一段时间给狗吃药,根据20小时后记录小狗的发病时间来推算有毒药水的方法被我直接否定。而且其他所有拿细分时间段做文章的解题思路也一并摒弃。

因为那些方法除了可操作性几乎没有外,还有一种必然出局的理由就是每个人都会想到它,这就无法达到出题者测试应聘者能力的目的。因此,我觉得固守时间段思路的应聘者很难不被淘汰。

确定了思考角度,我所面临的难点就是如何将10只小狗和1000瓶药水建立某种联系,而这种联系还要受24-20=4小时的制约。

我所能想到的是将药水以某种形式交叉混合,然后喂给小狗,最终通过分析中毒小狗的数量和次序来确定有毒药水。

但是思前想后,最终我还是没能理出具体头绪,无奈只好求助于百度了。

找到题目出处很简单,当我看到原帖第6楼网友“OO”回复的答案后,我彻底拜服了,也自此绝了进腾讯等大公司的念想。

-=================================================================-

下面请看网友“OO”的解法:

把狗从0-9编号;
把药水按1-1000编号;
把药水编号按二进制,如果第i位(因为最大1000,所以bit位为0-9)bit位为1,则分给编号为i的狗狗喝;
最后得一二进制数,如果编号为i的狗狗死了,该数的第i bit位为1,该数就是有毒的药水编号。

他说的比较专业,下面我用实例给解析一下:

用 0、1、2、3、4、5、6、7、8、9 给小狗编号;
而药水按1-1000编号;
我们把每瓶药水的编号转换为二进制数,由于2的10次方=1024,所以我们将二进制数定为有10个数位,如:

1=0000000001
13=0000001101
214=0011010110

对二进制转换不熟悉的朋友可以用“开始-程序-附件-计算器-查看-科学型”来轻松转换。
这样转换以后,每个药水编号的二进制数的每一位都分别对应一只小狗
我们定义每瓶药水要喂给其二进制编号位数为“1”的那位对应的小狗喝;
由于2的10次方=1024>1000,所以这些二进制编号组合都是唯一的;
当我们用不到4小时的时间将1000瓶药水分别喂给相应的小狗喝后,就可以去看看书,上上网,听听歌来打发剩下的20小时;

20小时候,在一个合理的药效发作时间后,我们统计有中毒症状小狗的编号,中毒的定为“1”,正常的定为“0”;
然后依照编号顺序排列,我们就可以得到一个10位的二进制数,而将这个二进制数再转换为十进制数后,这个数值就是有毒的药水的编号了;

例如,最终结果是编号为 2、4、6、7、9 的小狗有中毒症状,我们就将一个十位二进制数的2、4、6、7、9位设为“1”,其余各位设为“0”,即:0010101101;

而0010101101对应的十进制数=173,所以第173瓶药水就是有毒药水!

当然,如果都无毒,10只小狗就会都是活蹦乱跳的。

-=================================================================-

相信通过上面的解释,大家基本上都能理解这个解题思想的过程了吧。

回过头来反思为什么老王没能想出这么具体的解法呢?

最主要的一点还是思想不够活,没能将早就学过的计算机知识应用到实际解题过程中,这也就决定了我和OO等高手之间的差距。

介绍这种解题方法当然不等于没有其他更好的解法,只是我觉得这种解法就是出题者想要达成的目的。

而且在我看来,其他类似时间分块方法的可操作性和实现的科学性,照这个方法也确实是差的太多。

不过有一种现象很有趣,在原帖中,OO在第6楼就发布了他的解法,但下面还有数十上百个回帖在积极地发表和探讨各种漏洞百出的解法。看来人的思维的确很复杂,创新思想和求胜心理使很多人怀疑一个已经很不错的结论。不过我倒觉得适时肯定别人的成果并消化掉对自己的经验积累也很有用。

-=================================================================-

附言:

虽然我没能想出具体的解决方案,但是我很坚定的是不能沿着设时间点试毒的思路走。之所以这样,主要是我觉得,这种思路基本上每个人都能想到。
试想,随便找个人来问,是不是绝大多数人看到题目后最先想到的,都是把 24 - 20 = 4(小时) = 240(分钟) = 14400(秒) 分为1000份,然后每隔14秒给小狗依次试药,等到最后4个小时内观测小狗的中毒时间点呢?
所以,如果答案大家都能想到,也就失去了题目考察应聘者综合能力的效果。
于是,当看到“OO”的答案时,我才有了豁然开朗的感觉。

搜索文章
被屏蔽广告