某全球著名搜索引擎公司面试题。
说实话这类型的题如果你不知到真的很难解。 可能的思考方式是,(假设总共有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;
}