Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/1829.html
1829. Maximum XOR for Each Query
Level
Medium
Description
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:
- Find a non-negative integer
k < 2^maximumBitsuch thatnums[0] XOR nums[1] XOR ... XOR nums[nums.length-1] XOR kis maximized.kis the answer to thei-thquery. - Remove the last element from the current array
nums.
Return an array answer, where answer[i] is the answer to the i-th 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 == n1 <= n <= 10^51 <= maximumBit <= 200 <= nums[i] < 2^maximumBitnumsis sorted in ascending order.
Solution
Create an array prefixXors of length n, where prefixXors[i] is the xor from nums[0] to nums[i]. Each time, we need to find the k such that prefixXors[n - 1 - i] ^ k is maximized.
Since k < 2^maximumBit and all elements in nums are less than 2^maximumBit, obviously all elements in maximumXors are less than 2^maximumBit. Therefore, the maximum possible value for prefixXors[n - 1 - i] ^ k is (1 << maximumBit) - 1. The answer to the i-th query is perfixXors[n - 1 - i] ^ ((1 << maximumBit) - 1).
Finally, return the array of the answers.
-
class Solution { public int[] getMaximumXor(int[] nums, int maximumBit) { int maximum = (1 << maximumBit) - 1; int n = nums.length; int[] prefixXors = new int[n]; prefixXors[0] = nums[0]; for (int i = 1; i < n; i++) prefixXors[i] = prefixXors[i - 1] ^ nums[i]; int[] maximumXors = new int[n]; for (int i = 0; i < n; i++) { int prefixXor = prefixXors[n - 1 - i]; maximumXors[i] = maximum ^ (maximum & prefixXor); } return maximumXors; } } ############ class Solution { public int[] getMaximumXor(int[] nums, int maximumBit) { int xs = 0; for (int x : nums) { xs ^= x; } int mask = (1 << maximumBit) - 1; int n = nums.length; int[] ans = new int[n]; for (int i = 0; i < n; ++i) { int x = nums[n - i - 1]; int k = xs ^ mask; ans[i] = k; xs ^= x; } return ans; } } -
// OJ: https://leetcode.com/problems/maximum-xor-for-each-query/ // Time: O(N) // Space: O(1) class Solution { public: vector<int> getMaximumXor(vector<int>& A, int MB) { int N = A.size(), t = (1 << MB) - 1; vector<int> ans(N); for (int i = 0; i < N; ++i) { A[i] ^= i == 0 ? 0 : A[i - 1]; ans[N - i - 1] = t ^ A[i]; } return ans; } }; -
class Solution: def getMaximumXor(self, nums: List[int], maximumBit: int) -> List[int]: ans = [] xs = reduce(xor, nums) mask = (1 << maximumBit) - 1 for x in nums[::-1]: k = xs ^ mask ans.append(k) xs ^= x return ans ############ # 1829. Maximum XOR for Each Query # https://leetcode.com/problems/maximum-xor-for-each-query/ class Solution: def getMaximumXor(self, nums: List[int], maximumBit: int) -> List[int]: n = len(nums) m = (2 ** maximumBit) - 1 res = [] for i in range(1, n): nums[i] ^= nums[i - 1] for num in nums[::-1]: res.append(num ^ m) return res -
func getMaximumXor(nums []int, maximumBit int) (ans []int) { xs := 0 for _, x := range nums { xs ^= x } mask := (1 << maximumBit) - 1 for i := range nums { x := nums[len(nums)-i-1] k := xs ^ mask ans = append(ans, k) xs ^= x } return } -
function getMaximumXor(nums: number[], maximumBit: number): number[] { let xs = 0; for (const x of nums) { xs ^= x; } const mask = (1 << maximumBit) - 1; const n = nums.length; const ans = new Array(n); for (let i = 0; i < n; ++i) { const x = nums[n - i - 1]; let k = xs ^ mask; ans[i] = k; xs ^= x; } return ans; } -
/** * @param {number[]} nums * @param {number} maximumBit * @return {number[]} */ var getMaximumXor = function (nums, maximumBit) { let xs = 0; for (const x of nums) { xs ^= x; } const mask = (1 << maximumBit) - 1; const n = nums.length; const ans = new Array(n); for (let i = 0; i < n; ++i) { const x = nums[n - i - 1]; let k = xs ^ mask; ans[i] = k; xs ^= x; } return ans; }; -
public class Solution { public int[] GetMaximumXor(int[] nums, int maximumBit) { int xs = 0; foreach (int x in nums) { xs ^= x; } int mask = (1 << maximumBit) - 1; int n = nums.Length; int[] ans = new int[n]; for (int i = 0; i < n; ++i) { int x = nums[n - i - 1]; int k = xs ^ mask; ans[i] = k; xs ^= x; } return ans; } }