任何人都可以建议我使用O(n)
算法OR
对N个数字进行成对XOR
操作的结果,例如让N=3
和数字为5,7
, 9
5 ^ 7 = 2, 7 ^ 9 = 14, 9 ^ 5 = 12
2|14|12 = 14
^ for XOR
操作和| for OR
操作
答案 0 :(得分:7)
如果A[i]
与A[j]
中的k
不同,那么:<
A[i]
与A[1]
中的k
不同 - 位数为
或A[j]
与A[1]
中的k
不同
所以,N次操作就足够了:
// A[i] = array of source numbers, i=1..N
Result = 0
for i = 2 to N
Result = Result OR (A[i] XOR A[1])
print(Result)
答案 1 :(得分:5)
这些位是独立的,因此您可以分别计算每个位的结果。
因此,给定一系列位,我们现在想要所有成对XOR的OR。如果至少有一个按位XOR为1,则OR为1。如果输入序列中至少有一个0且至少有一个,则情况如此。很容易检查是否是这种情况。
总时间: O(wN)其中w是任何输入数字的最大位长。
假设 w 小于字大小,我们也可以在 O(N)中解决它:只需并行求解所有位:
have_one = 0
have_zero = 0
for x in input:
have_one |= x
have_zero |= ~x
return have_one & have_zero
have_one
恰好设置在输入中某处有1的位置。 have_zero
恰好设置在输入中某处为0的位置。对于那两种情况,结果都是1。