两个经典面试题(二进制思想)
1.你让工人为你工作7天,回报是一根金条,这个金条平分成相连的7段,每工作1天的回报就是1段。每天结束的时候,工人都有可能会向你要金条。如果只允许你两次把金条弄断,你如何给你的工人付费?
2.有1000个苹果,将它们放在10个箱子里,怎么放才能让我向你要苹果的时候,你都能整箱整箱的给我,你的给法是否唯一?
解答:
1. 工人可能在第1,2,3,4,5,6,7天结束时向你要金条,你给他的金条之和应分别为1,2,3,4,5,6,7.这样,如果把金条弄断两次,使得三段长分别为1,2,4,那每天结束时,如果这天工人找你要金条,你都可以满足这天工人可以得到的金条数是他工作的天数。因为1-7之间的数可以用3位二进制来表示,即1,2,4,而这恰好是金条的三段长。
比如:
工人第一天要金条:直接给段长为1
工人第一天要金条,第二天也要金条:给段长为2,同时收回段长为1
工人第一,二天未要金条,第三天要金条:给段长为1,2
工人第1天要金条,第2,3,4,5未要金条,第6天要金条:给段长2,4,收回段长为1
2. 要苹果的数量肯定是1-1000之间,也就是说任意给一个数1-1000之间,我必须知道它等于哪几个数之和。也是利用二进制思想,2^9 = 512, 2^10 = 1024,所以放1000个苹果需要10个箱子,每个箱子苹果数依次为
第0个箱子 2^0 = 1
第1个箱子 2^1 = 2
第2个箱子 2^2 = 4
第3个箱子 8
第4个箱子 16
第5