Welcome to Subscribe On Youtube
2425. Bitwise XOR of All Pairings
Description
You are given two 0-indexed arrays, nums1
and nums2
, consisting of non-negative integers. There exists another array, nums3
, which contains the bitwise XOR of all pairings of integers between nums1
and nums2
(every integer in nums1
is paired with every integer in nums2
exactly once).
Return the bitwise XOR of all integers in nums3
.
Example 1:
Input: nums1 = [2,1,3], nums2 = [10,2,5,0] Output: 13 Explanation: A possible nums3 array is [8,0,7,2,11,3,4,1,9,1,6,3]. The bitwise XOR of all these numbers is 13, so we return 13.
Example 2:
Input: nums1 = [1,2], nums2 = [3,4] Output: 0 Explanation: All possible pairs of bitwise XORs are nums1[0] ^ nums2[0], nums1[0] ^ nums2[1], nums1[1] ^ nums2[0], and nums1[1] ^ nums2[1]. Thus, one possible nums3 array is [2,5,1,6]. 2 ^ 5 ^ 1 ^ 6 = 0, so we return 0.
Constraints:
1 <= nums1.length, nums2.length <= 105
0 <= nums1[i], nums2[j] <= 109
Solutions
Solution 1: Quick Thinking + Bit Manipulation
Since each element of the array will be XORed with each element of another array, we know that the result remains the same when the same number is XORed twice, i.e., $a \oplus a = 0$. Therefore, we only need to count the length of the array to know how many times each element is XORed with each element of another array.
If the length of the nums2
array is odd, it means that each element in nums1
has been XORed an odd number of times with each element in nums2
, so the final XOR result of the nums1
array is the XOR result of all elements in the nums1
array. If it is even, it means that each element in nums1
has been XORed an even number of times with each element in nums2
, so the final XOR result of the nums1
array is 0.
Similarly, we can know the final XOR result of the nums2
array.
Finally, XOR the two results again to get the final result.
The time complexity is $O(m+n)$. Where $m$ and $n$ are the lengths of the nums1
and nums2
arrays, respectively.
-
class Solution { public int xorAllNums(int[] nums1, int[] nums2) { int ans = 0; if (nums2.length % 2 == 1) { for (int v : nums1) { ans ^= v; } } if (nums1.length % 2 == 1) { for (int v : nums2) { ans ^= v; } } return ans; } }
-
class Solution { public: int xorAllNums(vector<int>& nums1, vector<int>& nums2) { int ans = 0; if (nums2.size() % 2 == 1) { for (int v : nums1) { ans ^= v; } } if (nums1.size() % 2 == 1) { for (int v : nums2) { ans ^= v; } } return ans; } };
-
class Solution: def xorAllNums(self, nums1: List[int], nums2: List[int]) -> int: ans = 0 if len(nums2) & 1: for v in nums1: ans ^= v if len(nums1) & 1: for v in nums2: ans ^= v return ans
-
func xorAllNums(nums1 []int, nums2 []int) int { ans := 0 if len(nums2)%2 == 1 { for _, v := range nums1 { ans ^= v } } if len(nums1)%2 == 1 { for _, v := range nums2 { ans ^= v } } return ans }
-
function xorAllNums(nums1: number[], nums2: number[]): number { let ans = 0; if (nums2.length % 2 != 0) { ans ^= nums1.reduce((a, c) => a ^ c, 0); } if (nums1.length % 2 != 0) { ans ^= nums2.reduce((a, c) => a ^ c, 0); } return ans; }