【位运算 拆位法】1835. 所有数对按位与结果的异或和

简介: 【位运算 拆位法】1835. 所有数对按位与结果的异或和

本文涉及知识点

位运算 拆位法

LeetCode1835. 所有数对按位与结果的异或

列表的 异或和(XOR sum)指对所有元素进行按位 XOR 运算的结果。如果列表中仅有一个元素,那么其 异或和 就等于该元素。

例如,[1,2,3,4] 的 异或和 等于 1 XOR 2 XOR 3 XOR 4 = 4 ,而 [3] 的 异或和 等于 3 。

给你两个下标 从 0 开始 计数的数组 arr1 和 arr2 ,两数组均由非负整数组成。

根据每个 (i, j) 数对,构造一个由 arr1[i] AND arr2[j](按位 AND 运算)结果组成的列表。其中 0 <= i < arr1.length 且 0 <= j < arr2.length 。

返回上述列表的 异或和 。

示例 1:

输入:arr1 = [1,2,3], arr2 = [6,5]

输出:0

解释:列表 = [1 AND 6, 1 AND 5, 2 AND 6, 2 AND 5, 3 AND 6, 3 AND 5] = [0,1,2,0,2,1] ,

异或和 = 0 XOR 1 XOR 2 XOR 0 XOR 2 XOR 1 = 0 。

示例 2:

输入:arr1 = [12], arr2 = [4]

输出:4

解释:列表 = [12 AND 4] = [4] ,异或和 = 4 。

提示:

1 <= arr1.length, arr2.length <= 105

0 <= arr1[i], arr2[j] <= 109

拆位法

image.png

代码

核心代码

class Solution {
public:
  int getXORSum(vector<int>& arr1, vector<int>& arr2) {
    const int iBitCnt = 31;
    int iRet = 0;
    for (int i = 0; i < iBitCnt; i++) {
      int cnt1 = 0, cnt2 = 0;
      for (const auto& n : arr1) {
        cnt1 += bool(n & (1 << i));
      }
      for (const auto& n : arr2) {
        cnt2 += bool(n & (1 << i));
      }
      if ((1 & cnt1) && (1 & cnt2)) {
        iRet |= (1 << i);
      }
    }
    return iRet;
  }
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{
    assert(t1 == t2);
}
template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
    if (v1.size() != v2.size())
    {
        assert(false);
        return;
    }
    for (int i = 0; i < v1.size(); i++)
    {
        Assert(v1[i], v2[i]);
    }
}
int main()
{
  vector<int> arr1, arr2;
  {
    Solution sln;
    arr1 = { 1, 2, 3 }, arr2 = { 6, 5 };
    auto res = sln.getXORSum(arr1, arr2);
    Assert(0, res);
  }
  {
    Solution sln;
    arr1 = { 12 }, arr2 = { 4};
    auto res = sln.getXORSum(arr1, arr2);
    Assert(4, res);
  }
}


我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17

或者 操作系统:win10 开发环境: VS2022 C++17

如无特殊说明,本算法用**C++**实现。

相关文章
|
13天前
|
C++
位运算
位运算“【5月更文挑战第23天】”
18 1
|
20天前
leetcode:231. 2 的幂(位运算)
leetcode:231. 2 的幂(位运算)
12 0
|
20天前
[leetcode 数位运算] 2939. 最大异或乘积 M
[leetcode 数位运算] 2939. 最大异或乘积 M
|
12月前
|
存储 Java 程序员
“高端”的位运算
大家好,我是王有志。原计划迭代作为预备知识的收尾,不过在解2的幂和4的幂时,想到关于数字2的问题可以通过位运算去解决,因此补充了关于位运算的内容。
63 1
位运算中的按位与(&),按位或(|),按位异或(^)
位运算中的按位与(&),按位或(|),按位异或(^)
84 0
位运算中的按位与(&),按位或(|),按位异或(^)
回文数||(位运算)
题目: 判断一个非负整数n的二进制表示是否为回文数
127 0
【28. 最大异或对】
最大异或对就是在给定的数中,找到俩个数使得,这俩个数异或后的结果最大。 - 一般采用`暴力法`和`字典树`的方法。
115 0
【28. 最大异或对】
使用^、&(异或、并且)位运算 实现算数加法(+)
用位运算即是计算机的运算规则,而计算机只懂得二进制,所以位运算使用的进制是二进制。
125 0
使用^、&(异或、并且)位运算 实现算数加法(+)
|
机器学习/深度学习 C语言
C的|、||、&、&&、异或、~、!运算
C的|、||、&、&&、异或、~、!运算
88 0

热门文章

最新文章