需要逻辑(ANDing列表元素获得2的幂)

时间:2016-11-29 14:34:35

标签: python

我遇到了一个问题:

给定一个数组A.是否存在数组A的任何子集,如果我们对该子集的所有元素执行AND,那么输出应该是2的幂(例如:1,2,4,8,16等等) on)。

观察后我尝试了这样:

s = list(map(int,raw_input().split()))
x = [ True for x in s if x | (x+1) == (x+1)*2]
if len(x) > 0:
    print "YES"
else:
    print "NO"

有人会建议除此之外的其他逻辑吗?

1 个答案:

答案 0 :(得分:2)

我们将itertools.combinations使用输入集中的所有元素组合。

from itertools import combinations

def is_power_two(n):
    if n==1:
        return True
    if n<1:
        return False
    return is_power_two(n/2)

def do_they_and(s):
    for i in range(2, len(s)+1): 
        for j in combinations(s, i):
            total = 0
            for n in j:
                total &= n
            if is_power_two(total):
                return True

这可能是编程的最简单方法,但从效率的角度来看,最佳解决方案可能是动态编程。