最近做到一个算法题,要求judge the number whether is the power of two,即判断一个数是否是二的幂。
做的时候自己尽量可能地想把时间缩短,因为数据量比较大。
第一次。用了移位的方法后,提示Time limit exceeded。
第二次。考虑了建立一个数组,直接用数组存储该下标所代表的树是否满足条件的值。比如a[4]=1,a[6]=0。结果还是超时了。
第三次。分析了数字和二进制之间的关系:(~x & (x-1))-x+1。假设一个数x=4,用二进制表示为00000100。另一个数是6,用二进制表示为00000110。
x 00000100 00000110
~x 11111011 11111001
x-1 00000011 00000101
~x&(x-1) 00000011 00000001
(~x & (x-1))-x 11111111 11111011
(~x & (x-1))-x+1 00000000 11111100
可以得到满足条件的数在进行以上运算后会变为0。
但是结果还是超时。
第四次。没办法,继续研究。再次分析:以上的式子进行了五次的运算,所以努力地又把它缩减为四次运算:((~x+1) & x)-x
x 00000100 00000110
~x 11111011 11111001
~x+1 11111100 11111010
(~x+1) & x 00000100 00000010
((~x+1) & x)-x 00000000 11111100
可以得到满足条件的数在进行以上运算后会变为0。
但是结果还是超时。
第五次。实在没办法,继续压缩。最后居然压缩成了两次运算:(x-1)&x。
x 00000100 00000110
x-1 00000011 00000101
(x-1)&x 00000000 00000100
可以得到满足条件的数在进行以上运算后会变为0。
但是结果还是超级失望地超时了。
现在还是没能知道怎么弄,不知道是不是那个系统出了问题所以一直没通过。不过想想,自己居然把一个问题完成得这么好,还是蛮开心的!十分值得。
只是不知道上面的分析有没有错?