【C++刷题】优选算法——位运算

常见位运算操作总结:

  1. 基础位运算
    &:有0则为0
    |:有1则为1
    ^:相同为0,相异为1 / 无进位相加
  2. 运算符的优先级
    管它什么优先级,加括号就完事儿了
  3. 给一个数 n,确定它的二进制表示中的第 i (默认是从右起第0位) 位是 0 还是 1
    (n >> i) & 1
  4. 将一个数 n 的二进制表示的第 i 位修改为 1
    n |= (1 << i)
  5. 将一个数 n 的二进制表示的第 i 位修改成 0
    n &= (~(1 << i))
  6. 提取一个数 n 二进制表示中最右侧的 1 (lowbit操作)
    n & (-n)
    (-n) 将 n 最右侧的 1 的 左边的区域 全部变成了相反的位
  7. 干掉一个数 n 二进制表示中最右侧的 1
    n &= (n - 1)
    (n - 1) 将 n 最右侧的 1 的 右边的区域(包括最右侧的1),全部变成了相反的位
  8. 异或 ^ 运算的运算律
    n ^ 0 = n
    n ^ n = 0 - 消消乐
    a ^ b ^ c = a ^ (b ^ c)

根据第6、7条位运算操作,可以搞定1-3题。

  1. 位1的个数
int hammingWeight(int n)
{int ret = 0;while(n){++ret;n &= (n - 1);}return ret;
}
  1. 比特位计数
int hammingWeight(int n)
{int ret = 0;while(n){++ret;n &= (n - 1);}return ret;
}
vector<int> countBits(int n)
{vector<int> ret(n + 1);for(int i = 1; i <= n; ++i){ret[i] = hammingWeight(i);}return ret;
}
  1. 汉明距离
int hammingWeight(int n)
{int ret = 0;while(n){++ret;n &= (n - 1);}return ret;
}
int hammingDistance(int x, int y)
{int ret = 0;while(x && y){if((x & (-x)) < (y & (-y))){++ret;x &= (x - 1);}else if((x & (-x)) > (y & (-y))){++ret;y &= (y - 1);}else{x &= (x - 1);y &= (y - 1);}}ret += hammingWeight(x);ret += hammingWeight(y);return ret;
}

结合第 8 条位运算操作,可以搞定4-5题。
4. 只出现一次的数字

int singleNumber(vector<int>& nums)
{int ret = 0;for(int e : nums) ret ^= e;return ret;
}
  1. 只出现一次的数字 III
vector<int> singleNumber(vector<int>& nums)
{long long lowbit = 0;for(int e : nums) lowbit ^= e;lowbit &= (-lowbit);long long low_0 = 0, low_1 = 0;for(int e : nums){if(e & lowbit) low_1 ^= e;else low_0 ^= e;}return {(int)low_0, (int)low_1};
}
  1. 判定字符是否唯一
bool isUnique(string astr) 
{if(astr.size() > 26) return false;int hash = 0;for(char c : astr){int bit = 1 << (c - 'a');if( hash & bit ) return false;else hash |= bit;}return true;
}
  1. 丢失的数字
// 高斯求和
int missingNumber(vector<int>& nums)
{int n = nums.size();int sum = (0 + n) * (n + 1) / 2;for(int e : nums) sum -= e;return sum;
}// 异或 运算律
int missingNumber(vector<int>& nums)
{int n = nums.size();int ret = 0;for(int i = 0; i <= n; ++i) ret ^= i;for(int e : nums) ret ^= e;return ret;
}
  1. 两整数之和
int getSum(int a, int b)
{while(b){int no_carry = a ^ b;int carry = (a & b) << 1;a = no_carry;b = carry;}return a;
}
  1. 只出现一次的数字 II
int singleNumber(vector<int>& nums)
{int ret = 0;for(int i = 0; i < 32; ++i){int num = 0;for(int e : nums) if( e & (1 << i) ) ++num;if(num % 3) ret |= (1 << i);}return ret;
}
  1. 消失的两个数字
vector<int> missingTwo(vector<int>& nums)
{int n = nums.size();int N = n + 2;int num = 0;for(int i = 1; i <= N; ++i) num ^= i;for(int e : nums) num ^= e;int lowbit = num & (-num);int low_0 = 0, low_1 = 0;for(int i = 1; i <= N; ++i){if(i & lowbit) low_1 ^= i;else low_0 ^= i;}for(int e : nums){if(e & lowbit) low_1 ^= e;else low_0 ^= e;}return {low_0, low_1};
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/20591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【基本数据结构】平衡二叉树

文章目录 前言平衡二叉树1 简介2 旋转2.1 左旋2.2 右旋2.3 何时旋转 3 插入节点4 删除节点5 代码 参考资料写在最后 前言 本系列专注更新基本数据结构&#xff0c;现有以下文章&#xff1a; 【算法与数据结构】数组. 【算法与数据结构】链表. 【算法与数据结构】哈希表. 【…

【斯坦福因果推断课程全集】1_随机对照试验1

目录 The average treatment effect Difference-in-means estimation IID Sampling and Population Asymptotics Example: The linear model Regression adjustments with a linear model 随机对照试验&#xff08;RCT&#xff09;是统计因果推论的基础。如果有的话&#…

关于FPGA 使用SPI FLASH固化时如何配置固化参数

关于FPGA 使用SPI FLASH固化时如何配置固化参数 EDA工具&#xff1a;Vivado 关于FPGA 使用SPI FLASH固化时如何配置固化参数一、引言二、如何设置固化参数&#xff1a;使用50M的速度 &#xff0c;SPI为X4 &#xff0c;以及bit压缩第一&#xff1a;点open implenment design第二…

Android之onMeasure的三种模式

Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}在 Android 中&#xff0c;onMeasure() 方法是 View 或 ViewGroup 中的一个重要方法&#xff0c;用于测量视图的大小。在 onMeasure(…

安装软件缺少dll文件怎么办,分享多种解决dll问题的方法

在计算机使用过程中&#xff0c;我们经常会遇到安装软件时提示缺少dll文件的问题。这种情况通常会导致软件无法正常运行或启动。为了解决这个问题&#xff0c;我总结了以下五种方法&#xff0c;希望对大家有所帮助。 一&#xff0c;了解DLL文件是什么 动态链接库&#xff08;D…

简单说说我对集成学习算法的一点理解

概要 集成学习&#xff08;Ensemble Learning&#xff09;是一种机器学习技术框架&#xff0c;它通过构建并结合多个学习器&#xff08;也称为个体学习器或基学习器&#xff09;来完成学习任务。 集成学习旨在通过组合多个基学习器的预测结果来提高整体模型的性能。每个基学习…

常见仪表盘指示灯的含义,这次够全了!

汽车是当前主要的交通工具之一&#xff0c;给人们的工作、生活提供了便利。大家在学会开车的同时&#xff0c;也得了解一些基本的汽车常识&#xff0c;可以及时的发现车辆的问题&#xff0c;并作出正确的判断&#xff0c;以此降低车辆的损耗和维修成本。其中最基本的&#xff0…

房产证上加名?手把手教你操作,省钱又省心!

随着《民法典》的实施&#xff0c;房产的权属问题愈发受到重视。夫妻双方及其亲属常希望能在房产证上增添自己的名字&#xff0c;以保障各自的权益。那么&#xff0c;房产证上到底能写几个名字呢&#xff1f;以下是对这一问题的详细解答。 一、房产证命名无固定限制 在购房时&…

准确-K8s系列文章-修改containerd 默认数据目录

修改 Kubernetes 集群中 containerd 默认数据目录为 /data/containerd 前言 本文档适用于 Kubernetes 1.24 及以上版本的集群,介绍如何将 containerd 默认的数据目录从 /var/lib/containerd 修改为 /data/containerd。 步骤 1. 停止 containerd 服务(慎重!!!需评估风险!…

iOS中的UIScene和UISceneDelegate

目录 ​​​​​​​前言 一、AppDelegate和SceneDelegate的关系 1.AppDelegate 2.SceneDelegate 3.info.plist配置 4.生命周期方法对比 1.应用启动 2.进入前台 3.进入后台 5.何时使用AppDelegate和SceneDelegate 1.AppDelegate 2.SceneDelegate 前言 在iOS 13及之…

Linux内核编程入门:深度探索与实战挑战

Linux内核编程入门&#xff1a;深度探索与实战挑战 在操作系统的心脏地带&#xff0c;Linux内核以其强大、灵活和开源的特性吸引着众多程序员。对于那些渴望深入了解系统底层机制并亲手塑造操作系统的勇士们&#xff0c;Linux内核编程无疑是一个极具挑战性和吸引力的领域。本文…

民国漫画杂志《时代漫画》第39期.PDF

时代漫画39.PDF: https://url03.ctfile.com/f/1779803-1248636473-6bd732?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

Qt for Android : 使用libusb做CH340x串口传输的底层USB库

简介 Qt for Android自带的串口方案并没有适用在高的API版本中&#xff0c; 会出现permission denied的访问问题&#xff0c; 所以就需要使用Android API&#xff0c; 也就是在CPP中使用JNI方式进行调用&#xff0c; 为了开发的方便&#xff0c; 使用libusb库作为替代的底层usb…

SpringBoot注解--10--@Bean,对象注入的三种方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Bean一、如何使用方法注解注意Bean 的命名规则&#xff0c;当没有设置 name 属性时&#xff0c;那么 bean 默认的名称就是方法名&#xff0c;当设置了 name 属性之后…

解析Java中1000个常用类:Runnable 类,你学会了吗?

在 Java 编程中,处理并发和多线程是一个重要的主题。为了简化多线程编程,Java 提供了多种工具和类,其中最基本的一个工具就是 Runnable 接口。 Runnable 接口为创建和管理线程提供了一种标准的方式。本文将详细介绍 Runnable 接口的定义、实现原理、应用场景,并通过示例展…

33【Aseprite 作图】树——拆解

1 树叶 画树叶真累啊&#xff0c;可以先画一个轮廓&#xff0c;细节一点点修 2 1 2 &#xff1b;2 2 2 &#xff08;横着横&#xff09;&#xff0c;这样一点点画树叶 填充颜色&#xff0c;用了喷雾工具 2 树干部分 轮廓部分&#xff0c;左边的是3 3 3 &#xff1b;上下都是…

网页音频提取在线工具有哪些 网页音频提取在线工具下载

别再到处去借会员账号啦。教你一招&#xff0c;无视版权和地区限制&#xff0c;直接下载网页中的音频文件。没有复杂的操作步骤&#xff0c;也不用学习任何代码。只要是网页中播放的音频文件&#xff0c;都可以把它下载到本地保存。 一、网页音频提取在线工具有哪些 市面上的…

【数据结构】二叉树:简约和复杂的交织之美

专栏引入&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累…

Transformer中的位置编码PE(position encoding)

Transformer中的位置编码PE(position encoding) 1.提出背景 transformer模型的attention机制并没有包含位置信息&#xff0c;即一句话中词语在不同的位置时在transformer中是没有区别的 2.解决背景 给encoder层和decoder层的输入添加了一个额外的向量Positional Encoding&a…

平移数据c++

题目描述 将a数组中第一个元素移到数组末尾,其余数据依次往前平移一个位置。 输入 第一行为数组a的元素个数n&#xff1b; 第二行为n个小于1000的正整数。 输出 平移后的数组元素&#xff0c;每个数用一个空格隔开。 样例输入 10 1 2 3 4 5 6 7 8 9 10 样例输出 2 3 …