Company: Google
Difficult: Medium
Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai< 231.
Find the maximum result of ai XOR aj, where 0 ≤ i, j < n.
Could you do this in O(n) runtime?
Example:
Input: [3, 10, 5, 25, 2, 8]
Output: 28
Explanation: The maximum result is 5 ^ 25 = 28.
意思就是求出数组中两两取或的最大值。这个题目看似很简单,但是很不好做。
我开始的很简单的以为下面代码可以解决。
max_n = 0
len_n = len(nums)
for i in range(len_n-1):
for j in range(i,len_n):
temp = nums[i]^nums[j]
if temp > max_n:
max_n = temp
return max_n
但是时间复杂度太多啦。肯定不是正确答案。
而是看了其他的答案,就是下面的,后面我一一解释。确实不好理解啊。
answer = 0
for i in range(32)[::-1]:
answer <<= 1
print("here", answer)
prefixes = {num >> i for num in nums}
f = any(answer^1 ^ p in prefixes for p in prefixes)
print(f)
answer += f
print("answer2:", answer)
# answer += any(answer^1 ^ p in prefixes for p in prefixes)
return answer