comments | difficulty | edit_url | rating | source | tags | |||
---|---|---|---|---|---|---|---|---|
true |
Medium |
1523 |
Biweekly Contest 50 Q3 |
|
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 < 2maximumBit
such thatnums[0] XOR nums[1] XOR ... XOR nums[nums.length-1] XOR k
is maximized.k
is the answer to theith
query. - 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.
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.
First, we preprocess the XOR sum nums
, i.e.,
Next, we enumerate each element nums
from back to front. The current XOR sum is
That is to say, we start from the
The time complexity is nums
and maximumBit
respectively. Ignoring the space consumption of the answer, the space complexity is
class Solution:
def getMaximumXor(self, nums: List[int], maximumBit: int) -> List[int]:
ans = []
xs = reduce(xor, nums)
for x in nums[::-1]:
k = 0
for i in range(maximumBit - 1, -1, -1):
if (xs >> i & 1) == 0:
k |= 1 << i
ans.append(k)
xs ^= x
return ans
class Solution {
public int[] getMaximumXor(int[] nums, int maximumBit) {
int n = nums.length;
int xs = 0;
for (int x : nums) {
xs ^= x;
}
int[] ans = new int[n];
for (int i = 0; i < n; ++i) {
int x = nums[n - i - 1];
int k = 0;
for (int j = maximumBit - 1; j >= 0; --j) {
if (((xs >> j) & 1) == 0) {
k |= 1 << j;
}
}
ans[i] = k;
xs ^= x;
}
return ans;
}
}
class Solution {
public:
vector<int> getMaximumXor(vector<int>& nums, int maximumBit) {
int xs = 0;
for (int& x : nums) {
xs ^= x;
}
int n = nums.size();
vector<int> ans(n);
for (int i = 0; i < n; ++i) {
int x = nums[n - i - 1];
int k = 0;
for (int j = maximumBit - 1; ~j; --j) {
if ((xs >> j & 1) == 0) {
k |= 1 << j;
}
}
ans[i] = k;
xs ^= x;
}
return ans;
}
};
func getMaximumXor(nums []int, maximumBit int) (ans []int) {
xs := 0
for _, x := range nums {
xs ^= x
}
for i := range nums {
x := nums[len(nums)-i-1]
k := 0
for j := maximumBit - 1; j >= 0; j-- {
if xs>>j&1 == 0 {
k |= 1 << j
}
}
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 n = nums.length;
const ans = new Array(n);
for (let i = 0; i < n; ++i) {
const x = nums[n - i - 1];
let k = 0;
for (let j = maximumBit - 1; j >= 0; --j) {
if (((xs >> j) & 1) == 0) {
k |= 1 << j;
}
}
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 n = nums.length;
const ans = new Array(n);
for (let i = 0; i < n; ++i) {
const x = nums[n - i - 1];
let k = 0;
for (let j = maximumBit - 1; j >= 0; --j) {
if (((xs >> j) & 1) == 0) {
k |= 1 << j;
}
}
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 n = nums.Length;
int[] ans = new int[n];
for (int i = 0; i < n; ++i) {
int x = nums[n - i - 1];
int k = 0;
for (int j = maximumBit - 1; j >= 0; --j) {
if ((xs >> j & 1) == 0) {
k |= 1 << j;
}
}
ans[i] = k;
xs ^= x;
}
return ans;
}
}
Similar to Solution 1, we first preprocess the XOR sum nums
, i.e.,
Next, we calculate nums
from back to front. The current XOR sum is
The time complexity is nums
. Ignoring the space consumption of the answer, the space complexity is
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
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;
}
}
class Solution {
public:
vector<int> getMaximumXor(vector<int>& nums, int maximumBit) {
int xs = 0;
for (int& x : nums) {
xs ^= x;
}
int mask = (1 << maximumBit) - 1;
int n = nums.size();
vector<int> ans(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;
}
};
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;
}
}