gpt4 book ai didi

python - 对数组的连续子数组进行 XOR

转载 作者:太空狗 更新时间:2023-10-29 22:25:03 24 4
gpt4 key购买 nike

我需要从一个数组中找到通过对连续子数组进行异或运算获得的值,然后对由此获得的值进行异或运算。

输入

一行包含作为数组元素的整数。

例如[1,2,3]

输出

在单独的行中打印每个测试用例对应的答案。

到目前为止,我设法使用循环和递归方法构建了两个策略。我的方法都没有在大输入尺寸上提供良好的性能。

例如1 XOR 2 XOR 3 XOR (1 XOR 2) XOR (2 XOR 3) XOR (1 XOR 2 XOR 3) = 2

你能建立一个更好的算法吗?也许是动态规划方法?

from functools import reduce

# Calculate the XOR
def XOR(L):
return reduce(lambda x, y: x ^ y, L)

# Recursive approach
def allSubArraysXOR(L,L2=None):
if L2==None:
L2 = L[:-1]
if L==[]:
if L2==[]:
return 0
return allSubArraysXOR(L2,L2[:-1])
return XOR(L) ^ allSubArraysXOR(L[1:],L2)

# Loop - yielding approach
def getAllWindows(L):
for w in range(1, len(L)+1):
for i in range(len(L)-w+1):
yield XOR(L[i:i+w])

a = [int(a_temp) for a_temp in input().strip().split(' ')]
print(allSubArraysXOR(a))
# print(XOR(getAllWindows(a)))

最佳答案

我们不需要枚举 (2**n) 个子数组来解决这个问题。

XOR 有一些有用的属性,我们可以利用它们在 O(n) 时间内解决这个问题。具体来说:

要解决你的问题,我们首先需要计算每个元素在子数组中出现了多少次。任何出现偶数次的元素都可以忽略。其余的需要一起异或(每个只取一次)。

让我们看看这如何适用于您的示例:

1 XOR 2 XOR 3 XOR (1 XOR 2) XOR (2 XOR 3) XOR (1 XOR 2 XOR 3) = # open brackets
1 XOR 2 XOR 3 XOR 1 XOR 2 XOR 2 XOR 3 XOR 1 XOR 2 XOR 3 = # reorder
1 XOR 1 XOR 1 XOR 2 XOR 2 XOR 2 XOR 2 XOR 3 XOR 3 XOR 3 = # group
(1 XOR 1 XOR 1) XOR (2 XOR 2 XOR 2 XOR 2) XOR (3 XOR 3 XOR 3) = # remove pairs
1 XOR 0 XOR 3 =
1 XOR 3 =
2

下面是这个想法的 O(n) 实现:

def xor_em(lst):
n = len(lst)
ret = 0
for i, el in enumerate(lst):
count = (i + 1) * (n - i)
if count % 2:
ret ^= el
return ret

print xor_em([1, 2, 3])

子数组的计数由

count = (i + 1) * (n - i)

观察当前元素的左边有 i + 1 个元素(包括它自己),右边有 n - i 个元素(也包括它自己) .将两者相乘得出从当前元素左侧开始到其右侧结束的子数组数。

我们现在已将问题简化为寻找乘积为奇数的 (i + 1)(n - i) 对。请注意,获得奇数乘积的唯一方法是将两个本身为奇数的数字相乘(这可以通过考虑两个被乘数的质因数分解看出)。

有两种情况需要考虑:

  • n 为偶数时,(i + 1)(n - i) 之一始终为偶数。这意味着对于偶数长度的列表,该算法始终返回零。
  • n 为奇数时,(i + 1) * (n - i) 对于 i = 0, 2, 4, ... 为奇数, (n - 1).

这导致了以下简化的解决方案:

def xor_em(lst):
if len(lst) % 2 == 0:
return 0
else:
return reduce(operator.xor, lst[::2])

关于python - 对数组的连续子数组进行 XOR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41586750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com