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^maximumBit
such thatnums[0] XOR nums[1] XOR ... XOR nums[nums.length-1] XOR k
is maximized.k
is the answer to thei-th
query. - 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 == n
1 <= n <= 10^5
1 <= maximumBit <= 20
0 <= nums[i] < 2^maximumBit
nums
is 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; } }