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.
Example 3:
Input: nums = [0,1,2,2,5,7], maximumBit = 3
Output: [4,3,6,4,6,7]
This problem challenges us to find a k
value that maximizes the XOR sum of an array with k
, and then iteratively remove elements and repeat the process. Let's explore a solution.
A brute-force approach would involve iterating through all possible values of k
(from 0 to 2maximumBit - 1) for each query and calculating the XOR sum to find the maximum. This is inefficient, especially for larger arrays and maximumBit
values.
def solve_naive(nums, maximumBit):
answer = []
while nums:
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
We can optimize this by pre-calculating the XOR sum of the array. For each query, we can find the k
that maximizes the XOR sum by XORing the current XOR sum with the maximum possible value (2maximumBit - 1).
def solve_optimal(nums, maximumBit):
answer = []
xor_sum = 0
for num in nums:
xor_sum ^= num
max_val = (1 << maximumBit) - 1 # Maximum possible value
for _ in range(len(nums)):
k = max_val ^ xor_sum
answer.append(k)
xor_sum ^= nums.pop()
return answer
Let's trace the solve_optimal
function with nums = [0, 1, 1, 3]
and maximumBit = 2
:
xor_sum = 0
xor_sum ^= 0 => xor_sum = 0
xor_sum ^= 1 => xor_sum = 1
xor_sum ^= 1 => xor_sum = 0
xor_sum ^= 3 => xor_sum = 3
max_val = (1 << 2) - 1 = 3
k = 3 ^ 3 = 0
, answer.append(0)
, xor_sum ^= 3 => xor_sum = 0
, nums = [0, 1, 1]
k = 3 ^ 0 = 3
, answer.append(3)
, xor_sum ^= 1 => xor_sum = 1
, nums = [0, 1]
k = 3 ^ 1 = 2
, answer.append(2)
, xor_sum ^= 1 => xor_sum = 0
, nums = [0]
k = 3 ^ 0 = 3
, answer.append(3)
, xor_sum ^= 0 => xor_sum = 0
, nums = []
[0, 3, 2, 3]
The optimal solution has a time complexity of O(n), where n is the length of the input array nums
. This is because we iterate through the array once to calculate the initial XOR sum and then iterate again to find the k values and remove elements. Each operation within the loops takes constant time.
The space complexity of the optimal solution is O(1) because we only use a few extra variables (xor_sum, max_val, k) that do not depend on the size of the input array. The answer
list is technically O(n), but is required by the output, and doesn't count towards extra space complexity.
nums
is empty, the algorithm should return an empty array as the answer.maximumBit
is 0, then the only possible value for k
is 0. The algorithm should handle this case correctly.maximumBit
as long as the intermediate calculations do not overflow.def solve(nums, maximumBit):
answer = []
xor_sum = 0
for num in nums:
xor_sum ^= num
max_val = (1 << maximumBit) - 1 # Maximum possible value
for _ in range(len(nums)):
k = max_val ^ xor_sum
answer.append(k)
xor_sum ^= nums.pop()
return answer
# Example Usage
nums = [0, 1, 1, 3]
maximumBit = 2
result = solve(nums, maximumBit)
print(result) # Output: [0, 3, 2, 3]