我遇到了以下问题:给定s和x,计算满足1)s = a + b和2)x = a XOR b的解(a,b)的数量。所有数量和操作都是整数。
Example Inputs:
s = 10
x = 4
Output:
2
无法导入任何模块。
我写了以下答案,这些答案花了太长时间:
首先:
def answer(s,x):
tally = 0
z = 0
while z <= s:
p = s - z
q = int(z ^ p)
if x == q:
tally += 1
z += 1
return tally
第二
def answer(s,x):
spotlist, forwardlist = range(0,s+1)
backwardlist = range(s,-1,-1)
tally = 0
for spot in spotlist:
if x == forwardlist[spot] ^ backwardlist[spot]:
if s == forwardlist[spot] + backwardlist[spot]:
tally +=1
print tally
第三
def answer(s,x):
tally = 0
z = 0
while z <= s:
q = int(z ^ (s - z))
if x == q:
tally += 1
else:
pass
z += 1
print tally
我认为在删除某些可能的解决方案之前,我遗漏了某些内容或重复了这些内容。
答案 0 :(得分:1)
如果(a,b)是解对,那么(b,a)也是如此,因此可以将测试范围缩小一半。此外,您可以利用x = a ^ b
然后b = x ^ a
以下代码的速度是第一个answer()
功能的两倍以上
使用s, x = 10, 4
,速度提高4倍以上
与s, x = 255, 255
。
def xorsum(s, x):
tally = 0
for a in xrange(s//2 + 1):
tally += s - a == x ^ a
return 2 * tally
此函数使用Python False
和True
的数值分别为0和1的事实。这样做比使用if
测试要快,如果测试为真,则只增加tally
。
您可以使用列表理解来实现xorsum
:
def xorsum_lc(s, x):
return 2 * sum([s - a == x ^ a for a in xrange(s//2 + 1)])
但它比上述功能慢;等效的生成器表达式甚至更慢(正如预期的那样)。