You are given a sorted array nums
of n
non-negative integers and an integer maximumBit
. You want to perform the following query n
times:
k < 2maximumBit
such that nums[0] XOR nums[1] XOR ... XOR nums[nums.length-1] XOR k
is maximized. k
is the answer to the ith
query.nums
.Return an array answer
, where answer[i] is the answer to the ith query.
Example 1:
Input: nums = [0,1,1,3]
, maximumBit = 2
Output: [0,3,2,3]
Explanation:
The queries are answered as follows:
1st query: nums = [0,1,1,3]
, k = 0 since 0 XOR 1 XOR 1 XOR 3 XOR 0 = 3.
2nd query: nums = [0,1,1]
, k = 3 since 0 XOR 1 XOR 1 XOR 3 = 3.
3rd query: nums = [0,1]
, k = 2 since 0 XOR 1 XOR 2 = 3.
4th query: nums = [0]
, k = 3 since 0 XOR 3 = 3.
Example 2:
Input: nums = [2,3,4,7]
, maximumBit = 3
Output: [5,2,6,5]
Explanation:
The queries are answered as follows:
1st query: nums = [2,3,4,7]
, k = 5 since 2 XOR 3 XOR 4 XOR 7 XOR 5 = 7.
2nd query: nums = [2,3,4]
, k = 2 since 2 XOR 3 XOR 4 XOR 2 = 7.
3rd query: nums = [2,3]
, k = 6 since 2 XOR 3 XOR 6 = 7.
4th query: nums = [2]
, k = 5 since 2 XOR 5 = 7.
Describe an efficient algorithm to solve this problem. What is the time and space complexity of your solution?
The most straightforward approach is to iterate through the queries as described in the problem statement. For each query, calculate the XOR sum of the current nums
array. Then, iterate through all possible values of k
(from 0
to 2^maximumBit - 1
) and find the k
that maximizes the XOR sum. After finding k
, store it in the answer
array and remove the last element from nums
. This method directly implements the problem description.
def get_maximum_xor_brute_force(nums, maximumBit):
n = len(nums)
answer = []
for _ in range(n):
xor_sum = 0
for num in nums:
xor_sum ^= num
max_xor = -1
best_k = -1
for k in range(2**maximumBit):
current_xor = xor_sum ^ k
if current_xor > max_xor:
max_xor = current_xor
best_k = k
answer.append(best_k)
nums.pop()
return answer
For each query, we iterate through the nums
array to calculate the XOR sum (O(n)), and then iterate through all possible values of k
(O(2^maximumBit)). Since we perform n
queries, the overall time complexity is O(n * (n + 2^maximumBit)).
The space complexity is O(1) (excluding the output array), as we are only using a few variables to store the XOR sum and the best k
value.
We can optimize the solution by pre-calculating the XOR sum of the entire array once. For each query, we can then update the XOR sum by XORing it with the last element before removing it. We then find the optimal k
by creating the number such that all bits are flipped.
def get_maximum_xor_optimal(nums, maximumBit):
n = len(nums)
answer = []
xor_sum = 0
for num in nums:
xor_sum ^= num
for _ in range(n):
k = ((1 << maximumBit) - 1) ^ xor_sum
answer.append(k)
xor_sum ^= nums[n - 1 - _]
return answer
The time complexity is O(n) because we iterate through the array once to calculate the initial XOR sum and then perform a constant-time operation for each of the n
queries.
The space complexity is O(1) (excluding the output array), as we are only using a few variables to store the XOR sum and the best k
value.
nums
is empty, the initial XOR sum is 0. The algorithm should still work correctly.maximumBit
is small (e.g., 1), the number of possible k
values is also small.maximumBit
is close to 20, then 2^maximumBit
can be a relatively large number. It's important to ensure that the calculations involving 2^maximumBit
do not lead to integer overflow.