【位运算 拆位法】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++**实现。

相关文章
|
Ubuntu
Ubuntu系统安装gtest
Ubuntu系统安装gtest
650 0
|
4月前
|
人工智能 自然语言处理 IDE
代码生成智能体实战:打造程序员的AI编程助手
作为一名深耕AI编程领域多年的技术从业者,我见证了代码生成技术从最初的模板化生成到如今基于大语言模型的智能化代码生成的完整演进过程。在过去的三年里,我参与了多个企业级代码生成智能体(Code Generation Agent)项目的设计与实现,从最初简单的语法补全工具,到现在能够理解复杂业务逻辑并生成高质量代码的AI编程助手,这一技术的发展速度令人惊叹。
438 4
代码生成智能体实战:打造程序员的AI编程助手
|
C++
error C2220: 警告被视为错误 - 没有生成“object”文件
原文:error C2220: 警告被视为错误 - 没有生成“object”文件 这种错误的原因是:原因是该文件的代码页为英文,而我们系统中的代码页为中文。
6075 0
|
Java 应用服务中间件 Android开发
无法解析javax.servlet的解决方法
无法解析javax.servlet的解决方法
5013 0
无法解析javax.servlet的解决方法
|
分布式计算 JavaScript 前端开发
多线程、多进程、协程的概念、区别与联系
多线程、多进程、协程的概念、区别与联系
365 1
|
网络协议 安全 网络虚拟化
思科交换机配置命令归纳
【11月更文挑战第8天】本文总结了思科交换机的常见配置命令,包括模式转换、基本配置、查看命令、VLAN 配置、Trunk 配置、以太网通道配置、VTP 配置、三层交换机配置、生成树配置以及其他常用命令,适用于网络管理和维护。
1283 2
|
应用服务中间件 uml
【UML】软件工程中常用图:类图、部署图、时序图、状态图
【UML】软件工程中常用图:类图、部署图、时序图、状态图
2975 1
|
存储 Java 编译器
【Java异常】Variable used in lambda expression should be final or effectively final
【Java异常】Variable used in lambda expression should be final or effectively final
555 0
【Java异常】Variable used in lambda expression should be final or effectively final
|
Dart 编译器 API
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
|
算法 数据挖掘 开发者
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】