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]
Constraints:
nums.length == n
1 <= n <= 105
1 <= maximumBit <= 20
0 <= nums[i] < 2maximumBit
nums
is sorted in ascending order.This problem asks us to find the maximum XOR value achievable by XORing the current array with a number k
, and then remove the last element, repeating this process.
Core Idea: The key to efficiently solving this problem lies in understanding XOR properties. The XOR operation is commutative and associative. Furthermore, x ^ x == 0
for any x
. This means that if we have the XOR sum of the entire array, removing an element is simply XORing that element back into the sum.
Algorithm (Solution 2 - Optimized):
Calculate Initial XOR Sum: First, we calculate the XOR sum of all elements in nums
. Let's call this xs
.
Create Mask: We determine the maximum possible value of k
which is (1 << maximumBit) - 1
. This is a bitmask with all bits set to 1 up to maximumBit
. We will call this mask
.
Iterate and XOR: We iterate through the array nums
from right to left. For each element x
:
xs
with the mask
. This flips all bits in xs
resulting in the maximum value given the constraint. This is k = xs ^ mask
.k
to our result list ans
.xs
by XORing the current element x
: xs ^= x
. This effectively removes x
from the XOR sum.Return Result: Finally, we return the ans
list, containing the k
values for each query.
Time Complexity Analysis:
Space Complexity Analysis:
ans
list, which stores n integers.Code (Python - Solution 2):
def getMaximumXor(nums, maximumBit):
"""
Efficiently finds the maximum XOR for each query.
Args:
nums: A sorted list of non-negative integers.
maximumBit: The maximum number of bits allowed for k.
Returns:
A list of integers representing the answers to each query.
"""
xs = 0 # Initialize XOR sum
for x in nums:
xs ^= x
mask = (1 << maximumBit) - 1 # Create bitmask
ans = []
for x in reversed(nums): # Iterate from right to left
k = xs ^ mask # Calculate k for maximum XOR
ans.append(k)
xs ^= x # Remove x from XOR sum
return ans
This optimized solution avoids bit-by-bit manipulation, significantly improving efficiency. The other solution (Solution 1) is provided in the original response, demonstrating a less efficient, bit-by-bit approach. The time complexity of Solution 1 is O(n*m) where m is maximumBit. Solution 2 is preferred for its better time complexity.