黄锦的移动开发博客

专注Iphone,Android开发

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

某全球著名搜索引擎公司面试题。

说实话这类型的题如果你不知到真的很难解。  可能的思考方式是,(假设总共有n个节点,n是未知)当我走到第x个节点的时候,可以利用的信息是我已经走了x步了,需要想一种方式决定我是否选该节点,并且这种方式让当前节点被选中的概率是1/n.

 

这里的关键点时,解决的方法是,当走到第x步时,以1/x的概率决定是否选第x个。第x+1步时,以1/(x+1)步的概率决定是否选中第x+1个。这样第x个被当作最后结果的概率是,第x个被选中,第x个之后的(x+1,x+2,...,n)都没被选中。其概率为 1/x * x/(x+1) *(x+1)/(x+2) ... (n-1)/n  = 1/n 。


示例代码如下(未考虑输入错误检查):

Node* GetRandomNode(Node* header)

{

         Node* p = header;

         Node* result = nil;

         int count =0;

         for(; p != null; p = p->next)

        {

             count++;

             if(0 == random(count))

             {

                    result = p;

             }

             p = p->next;

        }

        return result;        

}

posted on 2010-09-26 14:31  黄锦  阅读(737)  评论(0编辑  收藏  举报