Taro Logo

Maximum XOR for Each Query

Medium
Amazon logo
Amazon
1 view
Topics:
ArraysBit Manipulation

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:

  1. Find a non-negative integer 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.
  2. Remove the last element from the current array 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?

Solution


Brute Force 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.

Code (Python)

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

Time Complexity

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)).

Space Complexity

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.

Optimal Solution

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.

Code (Python)

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

Time Complexity

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.

Space Complexity

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.

Edge Cases

  • Empty array: If the input array nums is empty, the initial XOR sum is 0. The algorithm should still work correctly.
  • MaximumBit is small: If maximumBit is small (e.g., 1), the number of possible k values is also small.
  • Large MaximumBit: If 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.
  • Zero in array: Presence of zero should not affect the correctness of the algorithm.