2425. 所有数对的异或和
链接: 2425. 所有数对的异或和
第 88 场双周赛 Q3 1622
给你两个下标从 0 开始的数组 nums1 和 nums2 ,两个数组都只包含非负整数。请你求出另外一个数组 nums3 ,包含 nums1 和 nums2 中 所有数对 的异或和(nums1 中每个整数都跟 nums2 中每个整数 恰好 匹配一次)。
请你返回 nums3 中所有整数的 异或和 。
题解
位运算数学化简(贡献法?)
对于朴素的 算法: (枚举每一个数对然后异或和)
class Solution {
public:
int xorAllNums(vector<int>& nums1, vector<int>& nums2) {
int res = 0;
for (int i = 0; i < nums1.size(); ++i)
for (int j = 0; j < nums2.size(); ++j)
res ^= nums1[i] ^ nums2[j];
return res;
}
};
有:
(上面实际上就是朴素算法的展开式), 我们由异或的性质: 可以得知
注: 只是为了表达奇偶性, 当其为偶
时( ) 可以不计算后面的异或和.
class Solution {
public:
int xorAllNums(vector<int>& nums1, vector<int>& nums2) {
int res = 0;
if (nums1.size() & 1)
for (int i : nums2)
res ^= i;
if (nums2.size() & 1)
for (int j : nums1)
res ^= j;
return res;
}
};