python中input数组_python – 关于数组的连续子数组的XOR

我们不需要枚举(2 ** n)个子阵列来解决这个问题.

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

>对于任何k:k XOR k == 0;

>对于任何k:k XOR 0 == k.

> XOR is both commutative and associative.

要解决您的问题,我们首先需要计算每个元素在子数组中出现的次数.出现偶数次的任何元素都可以忽略不计.其余的需要一起进行异或(每次只需一次).

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

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,3])

子阵列的计数是通过

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

使用观察结果,当前元素(包括其自身)左边有1个元素,右边有n – i(也包括自身).将两者相乘得出从当前元素的左侧开始并且在其右侧结束的子阵列的数量.

我们现在已经将问题减少到寻找产品为奇数的对(i 1)和(n – i).观察到获得奇数乘积的唯一方法是将两个本身相乘的数相乘(这可以通过考虑两个被乘数的主要因子来看出).

有两种情况需要考虑:

>当n为偶数时,(i 1)和(n-i)之一总是偶数.这意味着对于偶数长度的列表,算法总是返回零.

>当n为奇数时,(i 1)*(n-i)对于i = 0,4,…,(n-1)是奇数.

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

def xor_em(lst):

if len(lst) % 2 == 0:

return 0

else:

return reduce(operator.xor,lst[::2])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值