两道腾讯面试题

原创 2012年03月29日 16:17:31

      首先娱乐一下,看看这道学龄前儿童智力题,学龄前哦~真心伤不起!

      反正我看完之后是直接泪奔了,这道题目不是文艺儿童都做不出啊……

      

      好,进入主题,今天的主题是:没有蛀牙!呃,开个玩笑!

      首先看第一道题目:有1000个一模一样的瓶子,其中有999瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一个星期后死亡。现在,你只有10只小白鼠和一个星期的时间,如何检验出哪个瓶子里有毒药?

      其实一般出给面试者的时候,为了题目的开放性,并不会去固定小白鼠的数量,而是问,至少需要多少只小白鼠?(当然是越少越好咯,小白鼠也是生命啊)。这是一个涉及计算机基础科学的智力类题目。主要是考面试者的发散思维能力,因此并不要求面试者能第一时间内完全做正确。

      首先可以简单想到的是,需要999只,一只喝一瓶,然后等结果,哪个死了就是对应的瓶子里面的水有毒,都没死,那就是唯一的那一瓶没有喂给小白鼠的水有毒,但是这种方法用的小白鼠太多了。但是也不是完全没好处,是实验中平均死亡小白鼠最少的办法。

      再发散一下,用二分法迅速逼近结果,第一步,把1000瓶水分成A,B两堆,每堆500瓶,然后混合A堆500瓶的水,给一只小白鼠喝,小白鼠没死,则把B堆再分成C,D两堆(如果小白鼠死了,则把A堆再分成C,D两堆),把C堆250瓶的水混合一下给一只小白鼠喝,然后等结果……以此类推,你们懂的,一直这样二分下去,确定最终的结果,需要10只小白鼠。但是这样解答有个问题,就是等的时间太长了,不符合题目要求。而且如果运气不好,10只小白鼠可能全死了,小白鼠真惨。

      看来需要再次发散,根据题意,我们只能喂一次小白鼠(一次可以喂多只)。我们首先可以先把这个问题的规模减小,如果是2瓶水,那1只小白鼠就够了,如果是4瓶水呢?假设是A、B、C、D、四瓶水,我们可以这样做A+B混合喂给一个小白鼠1号,A+C喂给一个小白鼠2号,如果1号和2号都死了,那么就是A有毒,如果都没死,那是D有毒,如果只有1号死了,那么是B有毒,如果只有2号死了,那么是C有毒。嗯,有点意思了。给一只小白鼠喂水后最终的结果是生或者死两种状态,也就是说2只小白鼠最多可以表示的状态是4种(根据排列组合原理)。那么要表示1000种状态需要多少只小白鼠?10只,因为2的10次方是1024>1000,剩下的问题是怎么组合这些瓶子来给小白鼠喂水了。

      首先,把1000瓶水从0到999编号,然后用10位二进制来表示这些瓶子,10只小白鼠从1-10编号

      0 0 0 0 0 0 0 0 0 0    0号水瓶

      0 0 0 0 0 0 0 0 0 1    1号水瓶

      0 0 0 0 0 0 0 0 1 0    2号水瓶

      0 0 0 0 0 0 0 0 1 1    3号水瓶

      0 0 0 0 0 0 0 1 0 0    4号水瓶

      0 0 0 0 0 0 0 1 0 1    5号水瓶

      0 0 0 0 0 0 0 1 1 0    6号水瓶

      ……

      1 1 1 1 1 0 0 1 1 1    999号水瓶

 

      1 2 3 4 5 6 7 8 9 10    小白鼠

      然后把1-10号小白鼠按上面的10个二进制位对好,每只小白鼠喂水规则是:如果某个瓶子的对应2进制位为1则喂给该小白鼠,如果对应的2进制为0则不喂,譬如10号小白鼠,则会喝到1号水瓶,3号水瓶,5号水瓶,……和999号水瓶的混合水。喂完之后就是等结果了。

      死了的小白鼠标记1,没死的标记0。如果只有10号小白鼠死了,那么就是0 0 0 0 0 0 0 0 0 1,结果是1号水瓶有毒。如果是8,9号小白鼠死了那么就是0 0 0 0 0 0 0 1 1 0,结果是6号水瓶有毒,如果都没死,那就是0号水瓶有毒了,显然上面的混合方法里面0号水瓶的水没有喂给任何一只小白鼠。为什么这样?其实很容易想明白,有毒的水喂了的小白鼠都死了,其它的都没有死,就这么简单。一般在面试的时候没搞这么大的数据,一般是4只老鼠,16瓶水(真心是考思维过程)。

      其实这个方法有一个理论算法支撑:Bloom Filter算法。有兴趣的可以查查资料。

      附带说再多说一句,小白鼠真惨。

 

      第二道题目,是一个C++基础题目。我常常拿这个题目考那种简历上面写着精通C++的面试者(当然,一般是应届生)。首先准备一页白纸,在它的A面写上这样一段代码:

      class A
      {
      public:
            void function(){printf("Hello World");}

      };

      ……

      A* p1 = NULL;
      p1->function();

      ……

 

      在它的B面写上同样一段代码,只有一点点差异:

      class A
      {
      public:
            virtualvoid function(){printf("Hello World");}
      };

      ……

      A* p1 = NULL;
      p1->function();

      ……

      然后这样开始问,首先拿着A面的程序给面试者,问它程序会怎么样,面试者可能的答案是:一种是程序直接crash,二种是程序输出Hello World,运行正常,三种是程序输出Hello World,然后crash;然后把纸翻过来,再问面试者,程序会怎么样。如果面试者能把这个问题回答正确,并且解释清楚(关键是解释清楚),说明面试者的C++基础还是不错的。

      这个题目的真实答案,就不公布了,知道原因了,很简单,可以看下下面这段程序的汇编代码(一目了然):

      #include <stdio.h>
      class A
      {
      public:
            void function(){printf("Hello World");}

      };

      class B
      {
      public:
            virtual void function(){printf("Hello World");}
      };

      int _tmain(int argc, _TCHAR* argv[])
      {
            A* p1 = NULL;
            p1->function();

            B* p2 = NULL;
            p2->function();

      };

      A* p1 = NULL;
004113FC  mov         dword ptr [p1],0 
      
p1->function();
00411403  mov         ecx,dword ptr [p1]
00411406  call        A::function (4110E6h)

      B* p2 = NULL;
0041140B  mov         dword ptr [p2],0 
      
p2->function();
00411412  mov         eax,dword ptr [p2]
00411415  mov         edx,dword ptr [eax]
00411417  mov         esi,esp
00411419  mov         ecx,dword ptr [p2]
0041141C  mov         eax,dword ptr [edx]
0041141E  call        eax 
00411420  cmp         esi,esp


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

腾讯面试题(附答案)

这里的答案都是本人做的,非标准答案。如果错误,请在评论里指正,一起讨论共同进步!谢谢!腾讯面试题1、大端与小端的概念?各自的优势是什么?【答】大端与小端是用来描述多字节数据在内存中的存放顺序,即字节序...

2个腾讯百度的智力题

1:智力题:有100个球,两个人顺序抽球,任意抽1-4个球,问是你先抽还是第二次抽能保证使你抽到最后一个球? 答案:第二个抽取的可以拿到最后一个球 分析:方法一:区间划分,抽取求的范围是1-4.则...

腾讯面试智力题

现在有100瓶药,只有1瓶是有毒的,老鼠试完药后,需要3天才能才能知道药是否有毒,而现在需要3天知道100瓶中哪1瓶有毒,请问最少需要多少只老鼠。 因为2^7=128>=100,最少需要7只 ...

100层楼摔鸡蛋问题

转自: http://blog.csdn.net/niteip/article/details/12789027 昨天晚上的笔试题(多益网络),题目描述: 某某有2个硬度相同的鸡蛋,...

两道面试题所引发的C指针的思考

C语言是一门使用比较广泛的高级编程语言,而指针则是C语言的精髓所在,可以说学习C语言不会灵活使用指针就谈不上精通C语言。但是由于C语言指针的灵活性导致了我们在使用过程中出现莫名其妙的各种问题,甚至是段...

两道面试题:2012年10月9号阿里巴巴笔试

1. n个无序整数,已知第i个数在排好序的序列中的位置为j,满足|i-j| 的得两分,总分是20分。 借鉴的答案: 答:由以上条件判断最小的数字一定在前k个中,于是可以讲前k个数建...

两道面试题(英文版)

今天下午小陈给我发了两道面试题,我花了点时间研究了一下。 现在在这里总结: 题目一: Problem Statement # 1Given a set of N (> 1) positive i...

设计的两道面试题C++

C++面试题设计

看网友的一道腾讯面试题有感

10000+个数字钟找出top100 Java代码   import java.util.Arrays;   import java.util.Random;     publi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)