终于知道当初微软的面试题,我错在哪里了……

有两杯液体,一杯蓝色一杯红色,两杯液体的体积一样。从红色液体中取出一试管液体,倒入蓝色液体中,搅匀。再从原来蓝色(现在是混合的)液体中取出同样一试管的液体,倒入红色中,搅匀。问最后两个杯子中,哪个杯子里的杂质更多。

嗯……给出当时我的思路吧:

从红的中取出一试管,倒入蓝的中,搅匀。这时候蓝色溶液里杂质的浓度为a。然后再从这杯杂质浓度为a的液体中取出一试管,倒入红的里。由于红的之前是纯净的,倒入杂质浓度为a的液体后,相当于对这个液体做稀释,因此现在红色这杯子里的杂质浓度小于a。又因为这个时候两杯子里液体体积还是一样的,因此杂质浓度高的杯子里杂质更多,也就是蓝色液体的杯子。

但是,从另一个角度想想,最终两杯子里液体的体积是一样的,如果两杯子里杂质的密度不一致,比如蓝色的里面杂质多,那么,可以推出,红色的液体的总量会多于蓝色液体。这就与初始时“两个杯子液体体积一样”是矛盾的。

所以,我的推理一定错了。不管怎么倒,最终结果,两个杯子的杂质一定一样多!

数学是最严谨的。先用数学算一遍吧。假设两个液体最初的体积是L,试管的体积是l,那么第一次倒后,蓝色液体里含有l积的红色液体,搅匀后,蓝色杯子中总体积为(L+l),从这个杯子里舀出l体积的一试管液体中,含有红色液体l*l/(L+l),含有蓝色液体l*L/(L+l)。蓝色杯子里还剩下L*l/(L+l)体积的红色液体和L*L/(L+l)的蓝色液体。将试管里的混合液倒入(L-l)体积的红色液体后,蓝色液体体积是l*L/(L+l),红色液体是(L-l)+l*l/(L+l)。由于蓝色杯子中,杂质红色液体的体积L*l/(L+l),与红色杯子中,杂质蓝色液体的体积l*L/(L+l)相等,因此两个杯子里杂质一样多。

好吧,我确实错了。但是,我错在哪了呢?

再重新考虑一遍我的想法:

从红的中取出一试管,倒入蓝的中,搅匀。这时候蓝色溶液里杂质的浓度为a。——这个应该是没有问题的。红色的杂质浓度为a=l/(L+l)

然后再从这杯杂质浓度为a的液体中取出一试管,倒入红的里。——依旧OK,a的值没有变化。

由于红的之前是纯净的,倒入杂质浓度为a的液体后,相当于对这个液体做稀释,因此现在红色这杯子里的杂质浓度小于a。——嗯……这个……坏了!

a的浓度是相对于蓝色液体而言的红色液体浓度,但是,当把这个试管内的液体倒入红色液体的杯子时,杂质的概念变了!对红色杯子而言,蓝色才是杂质,因此,这个试管里的杂质浓度实际上是[1-l/(L+l)],也就是L/(L+l)!这样,实际被稀释的就是蓝色液体!而L/(L+l)l/(L+l)明显是不等的!因此之后的推理就全部是错误的了……

ok,想明白了,长出一口气……

Googol Lee

多年生软件工程师,信仰开源

Munich, Germany http://air.googol.im