[英]From 4 given arrays(not sorted), find the elements from each array whose sum is equal to some number X
[英]Given an array; I need the sub-arrays; whose elements' XOR value is equal to some given value
说我有:arr = {4,2,2,6,4}和m = 6(我需要检查哪些子数组的XOR给出6)
因此,子数组将是:{4,2},{4、2、2、6、4},{2、2、6}和{6}(总计= 4)
我需要:每个子数组的开始和结束的索引(或它们各自的长度),以O(n)时间为单位。
我需要一个O(n)方法-因此我尝试了在网站上找到的以下代码。 问题在于它给出了此类子数组的“数量”。
def subarrayXor(arr, n, m):
ans = 0
# Create a prefix xor-sum array such that
# xorArr[i] has value equal to XOR
# of all elements in arr[0 ..... i]
xorArr =[0 for _ in range(n)]
# Create map that stores number of prefix array
# elements corresponding to a XOR value
mp = dict()
# Initialize first element
# of prefix array
xorArr[0] = arr[0]
# Computing the prefix array.
for i in range(1, n):
xorArr[i] = xorArr[i - 1] ^ arr[i]
# Calculate the answer
for i in range(n):
# Find XOR of current prefix with m.
tmp = m ^ xorArr[i]
# If above XOR exists in map, then there
# is another previous prefix with same
# XOR, i.e., there is a subarray ending
# at i with XOR equal to m.
if tmp in mp.keys():
ans = ans + (mp[tmp])
# If this subarray has XOR
# equal to m itself.
if (xorArr[i] == m):
ans += 1
# Add the XOR of this subarray to the map
mp[xorArr[i]] = mp.get(xorArr[i], 0) + 1
return ans
我有一个O(n ** 2)的解决方案。 如果可以通过某种方式对此进行修改以将时间减少到O(n),将不胜感激。
n = int(input())
a = [int(i) for i in input().split()]
suff = list(a) #suffix xor
for i in range(1,n):
suff[i] = suff[i-1]^a[i]
#print(suff)
m = int(input())
out = list()
for i in range(0,n-1):
for j in range(i+1,n):
if i != 0:
B = suff[i-1]^suff[j]
if B == m:
out.append([i,j])
else:
if suff[j] == m:
out.append([i,j])
print(out)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.