有趣的位运算刷题笔记

363 阅读2分钟

这是我参与新手入门的第一篇文章。 主要分享一下之前刷题中遇到一些关于位运算的有意思的题

1,10只武大朗喝药问题

题目:

说有1000瓶敌敌畏,但是只有一瓶有毒。现在有10只武大鼠来测试,问怎么给大朗喝药可以最快测出来哪瓶有毒。

思路:

这是个测试常考智力题。智力题很多都和数位有关,看到1000首先就确定一个事儿,他比1024小一点。巧了,正好2的10次方和10只老鼠呼应上了。

解答:

将1000瓶药编号1-1000.然后让10只老鼠固定位置在1条线上乖乖站好,模拟10个位。然后编号x的药,x不会大于10,x中所有比特位为1的位置对应的老鼠都来一口。就像这样:

'mouses:[10,9,8,7,6,5,4,3,2,1]'
x==1;x==0b0000000001;//只有最后一位是1,则让最后一只老鼠来一口
......
x==100;x==0b0001100100;//从右边起,第3,6和7位都是1,则让相应相应编号的老鼠整一口
......
//1000瓶都喝过了之后,就等毒发了。
//如果最后死的老鼠是3,6,7,那么自然可以反向得到数字100,则编号为100的药就是有毒的。

//来点伪代码
mouses = list(range(10))
for i in range(1,1001):
    index=0
    while i:
        if i&1:
            mouses[index].drink(i)
        i>>1
        index+=1

res =0
for k,v in enumerate(mouses):
    if v.isdead():
    	res=res|1<<k
return res 

小结

终于够400字了。新手入门,如有错误请见谅。