位运算算法:编程世界中的魔法符号

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

文章目录

目录

文章目录

前言

一. 常见位运算总结

二、常见位运算题目

2.1 位1的个数

2.2 比特数记位(典型dp)

 2.3 汉明距离

2.4 只出现一次的数字(1) 

2.5 只出现一次的数字(2)  

 2.6 只出现一次的数字(3)

 2.7  判断字符是否为1

2.8 丢失的数字

 2.9 两整数之和

 2.10 消失的两个数字

总结


前言

本篇详细介绍了位运算算法的使用,让使用者了解位运算,而不是仅仅停留在表面, 文章可能出现错误,如有请在评论区指正,让我们一起交流,共同进步!


一. 常见位运算总结

二、常见位运算题目

2.1 位1的个数

191. 位1的个数 - 力扣(LeetCode)

 利用第七条特性:n&(n-1)干掉最后一个1,然后每次都用count++去统计,直到变成0

class Solution {
public:int hammingWeight(int n) {int count = 0;while(n&(-n)){n&=(n-1);count++;}return count;}
};

2.2 比特数记位(典型dp)

338. 比特位计数 - 力扣(LeetCode)

 思路1:每遍历一个数都用n&(n-1)去数他一共有多少个1,然后放ret数组中

class Solution {
public:vector<int> countBits(int n) {vector<int> ret(n+1);for(int i = 0 ;i<=n;i++){int m = i;int count = 0;while(m&(-m)){m&=(m-1);count++;}ret[i] = count;}return ret;}
};

 思路2:简单dp(前缀和 + 位运算

我们发现第i个位置的1的个数等于第i-1位置的1的个数+1

class Solution {
public:vector<int> countBits(int n) {vector<int> ret(n+1);for(int i = 1 ;i<=n;i++){ret[i] = ret[i&(i-1)] + 1;}return ret;}
};

 2.3 汉明距离

461. 汉明距离 - 力扣(LeetCode)

        利用异或相同为0相异为1的特点,x和y异或后不一样的位都会变成1,这个时候再用n&(n-1)去统计1个个数,即为这两个数字的汉明距离 

class Solution {
public:int hammingDistance(int x, int y) {//异或的特点,相同为0,相异为1     然后再利用n&(n-1)统计1的个数int n=x^y;int count=0;while(n){n&=(n-1);++count;}return count;}
};

2.4 只出现一次的数字(1) 

136. 只出现一次的数字 - 力扣(LeetCode) 

 思路:利用异或的性质,出现两次的数异或后为0,出现一次的数异或0还是本身 

class Solution {
public:int singleNumber(vector<int>& nums) {int value = 0;for(auto &e : nums){value^=e;}return value;}
};

2.5 只出现一次的数字(2)  

137. 只出现一次的数字 II - 力扣(LeetCode) 

具体地,考虑答案的第 iii 个二进制位(iii 从 000 开始编号),它可能为 000 或 111。对于数组中非答案的元素,每一个元素都出现了 333 次,对应着第 iii 个二进制位的 333 个 000 或 333 个 111,无论是哪一种情况,它们的和都是 333 的倍数(即和为 000 或 333)。因此:

答案的第 iii 个二进制位就是数组中所有元素的第 iii 个二进制位之和除以 333 的余数。 

class Solution {
public:int singleNumber(vector<int>& nums) {int ans = 0;for (int i = 0; i < 32; ++i) {// 统计该每个数字第i个比特位为1的总数int total = 0;for (int num: nums) {total += ((num >> i) & 1);}// 如果total能够被3整除,说明只出现一次的数字在该位置上一定是0// 否则在该位置上一定是1if (total % 3) {ans |= (1 << i);}}return ans;}
};

 2.6 只出现一次的数字(3)

260. 只出现一次的数字 III - 力扣(LeetCode) 

 

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {unsigned int temp=0;//遇到INT_MIN会溢出,10000……00for(int num:nums) temp^=num;int x=temp&(-temp);//x拿到最后一个1,即两个数不同的地方//int x= (temp == temp ? temp : temp & (-temp));int type1=0,type2=0;for(int num:nums) if(num&x) value1^=num; else value2^=num;return {value,value};}
};

一般解法:

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {sort(nums.begin(), nums.end());vector<int> res;int i = 0;for (; i < nums.size() - 1; ) {if (nums[i] == nums[i + 1]) {i += 2;} else {res.push_back(nums[i]);i += 1;}}if (i < nums.size()) {res.push_back(nums[i]);}return res;     }
};

 2.7  判断字符是否为1

面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode) 

class Solution {
public:bool isUnique(string astr) {// 利用鸽巢原理做优化if(astr.size()>26) return false;int bitMap = 0;for(auto& ch : astr){int i = ch - 'a';// 先判断字符是否出现过if((bitMap>>i) & 1 == 1) return false;// 将当前字符加入到位图中bitMap |= (1<<i);}return true;}
};

2.8 丢失的数字

268. 丢失的数字 - 力扣(LeetCode) 

 

思路1:高斯公式

 

class Solution {
public:int missingNumber(vector<int>& nums) {int n = nums.size();int ret = ((0 + n)*(n+1))/2;for(auto& e : nums){ret -= e;}return ret;}
};

思路2:异或运算 

class Solution {
public:int missingNumber(vector<int>& nums) {int n = nums.size();int ret = 0;for(auto& e : nums) ret^=e;for(int i = 0;i<=n;i++) ret^=i;return ret;}
};

 2.9 两整数之和

371. 两整数之和 - 力扣(LeetCode) 

 

class Solution {
public:int getSum(int a, int b) {while(b != 0){int x = a^b; //先算出无进位相加的结果unsigned int carry = (unsigned int)(a&b)<<1; //算出进位,//要考虑-1,因为-1的右移操作是没有定义的a = x;b = carry;}return a;}
};

 2.10 消失的两个数字

面试题 17.19. 消失的两个数字 - 力扣(LeetCode) 

 

class Solution {
public:vector<int> missingTwo(vector<int>& nums) {//1.将所有的数异或在一起int tmp = 0;for(auto& e : nums)tmp^=e;for(int i = 1;i<=nums.size()+2;i++)tmp^=i;//2. 找a,b中比特位不同的那一位int x = tmp&(-tmp);// 3. 根据比特位不同的那一位,划分成两类来异或int a = 0, b = 0;for(auto& e : nums){if(e&x) a^=e;else    b^=e;}for(int i=1;i<=nums.size()+2;++i){if(i&x) a^=i;  else  b^=i;}return {a,b};}
};

总结

✨✨✨各位读友,本篇分享到内容是否更好的让你理解位运算算法,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!

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

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

相关文章

OpenGL系列(六)变换

在三角形和纹理贴图示例中&#xff0c;顶点使用的是归一化设备坐标&#xff0c;在该坐标系下&#xff0c;顶点的每个轴的取值为-1到1&#xff0c;超出范围的顶点不可见。 基于归一化设备坐标的物体的形状随着设备的大小变换而变化&#xff0c;这里产生的第一个问题是&#xff0…

三极管的理解

三极管的放大使用 基极集电极之间可理解为电子扩展 电化学效应&#xff1b;产生载流子多少&#xff0c;从而射集间而流动大小 电化学效应&#xff0c;电子漂移现象&#xff0c;基极与集电极的电流的作用在于产生载流子 电流的流动&#xff0c;需要载流子&#xff0c;从而基极…

Linux初识地址空间

前言 上一期我们对进程优先级、命令行参数以及环境和变量做了介绍&#xff01;以前我们就提到过一个问题有了运行队列为什么还要有优先级&#xff1f;本期将带你揭晓&#xff01; 本期内容介绍 虚拟地址空间的引入 虚拟地址空间的介绍 如何理解地址空间 为什么要有地址空间 如…

Elasticsearch:智能 RAG,获取周围分块(一)

作者&#xff1a;来自 Elastic Sunile Manjee 在检索增强生成 (RAG) 领域&#xff0c;一个持续存在的挑战是找到输入大型语言模型 (LLM) 的最佳数据量。数据太少会导致响应不足或不准确&#xff0c;而数据太多会导致答案模糊。这种微妙的平衡启发我开发了一个专注于智能分块和利…

花钱就能过?PMP到底有没有用

在项目管理领域&#xff0c;PMP&#xff08;Project Management Professional&#xff09;认证常被看作是专业能力的金牌标准。 然而&#xff0c;伴随着这一认证的普及&#xff0c;也出现了一些质疑声&#xff0c;比如“PMP认证是否只是金钱和时间的投入就能获得的证书&#xf…

Mybatis工作流程和插件开发

在了解插件开发之前&#xff0c;我们先总体的来梳理一下Mybatis的大致执行流程&#xff1a; 1.new SqlSessionFactoryBuilder().build(inputStream):先根据配置文件&#xff08;包含了全局配置文件和映射配置文件&#xff09;初始化一个对象Configuration&#xff08;这里对象里…

Java | Leetcode Java题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; class MinStack {Deque<Integer> xStack;Deque<Integer> minStack;public MinStack() {xStack new LinkedList<Integer>();minStack new LinkedList<Integer>();minStack.push(Integer.MAX_VALUE);}public void …

哈喽GPT-4o——对GPT-4o 文本创作的思考与看法

目录 用法1&#xff1a;创作小说用法2&#xff1a;创作散文用法3&#xff1a;创作诗歌1、古诗2、现代诗 用法4&#xff1a;创作儿童故事用法5&#xff1a;创作剧本 大家好&#xff0c;我是哪吒。 都说ChatGPT4o是目前文本创作的最强大模型&#xff0c;它都可以用于哪些方面的文…

虚拟化 之四 详解 jailhouse 使能和创建 Cell 的工作流程

完整的 Jailhouse 组件主要由内核模块(jailhouse.ko)、虚拟机管理程序固件(jailhouse*.bin)、管理工具(jailhouse 命令行程序及一些 Python 脚本)以及配置文件(.cell)这四部分组成。用户使用它们来启用虚拟机管理程序、创建 Cell、加载 inmate 二进制文件以及运行和停止…

CCPD数据集

官网&#xff1a;https://github.com/detectRecog/CCPD 其它介绍&#xff1a;https://blog.csdn.net/qianbin3200896/article/details/103009221 CCPD (Chinese City Parking Dataset, ECCV) provinces ["皖", "沪", "津", "渝", &…

跟着刘二大人学pytorch(第---13---节课之RNN高级篇)

文章目录 0 前言0.1 课程视频链接&#xff1a;0.2 课件下载地址&#xff1a; 1 本节课任务描述模型的处理过程训练循环初始化分类器是否使用GPU构造损失函数和优化器每个epoch所要花费的时间遍历每个epoch时进行训练和测试记录每次测试的准确率加入到列表中 具体实现&#xff0…

0基础可以直接学python自动化测试吗?

可以直接学习Python自动化测试&#xff0c;即使没有编程基础。Python是一种易于学习和上手的编程语言&#xff0c;也是自动化测试领域中最受欢迎的语言之一。下面是一篇超详细和规范的文章&#xff0c;将从零开始介绍Python自动化测试的基础知识。 1. 安装Python和开发环境 首…

项目进度和成本管理

1.如何正确标识出软件项目活动&#xff1f; 正确标识软件项目活动是项目管理中的一个重要步骤&#xff0c;它有助于确保项目的顺利进行和成功完成。以下是一些标识软件项目活动的步骤和建议&#xff1a; 项目范围定义&#xff1a;首先明确项目的目标和范围&#xff0c;这将帮助…

初识前端开发

目的 &#xff1a;开发一个网站 -前端开发&#xff1a;html 、css、javaScript -web框架&#xff1a;接收请求处理 -mysql数据库&#xff1a;存储数据的地方 快速上手&#xff1a; 基于Flask web框架让你快速搭建一个网站出来 学习&#xff1a; 基于Django框架 初识HTML …

刷代码随想录有感(106):动态规划——分割等和子集(01背包问题)

题干&#xff1a; 代码&#xff1a; class Solution { public:bool canPartition(vector<int>& nums) {int sum 0;for(int i : nums){sum i;}if(sum % 2 ! 0)return false;int target sum / 2;vector<int>dp(10001, 0);for(int i 0; i < nums.size(); …

Windows11和Ubuntu22双系统安装指南

一、需求描述 台式机电脑&#xff0c;已有Windows11操作系统&#xff0c;想要安装Ubuntu22系统&#xff08;版本任意&#xff09;。其中Windows安装在Nvme固态上&#xff0c;Ubuntu安装在Sata固态上&#xff0c;双盘双系统。开机时使用Grub控制进入哪个系统&#xff0c;效果图…

Python进阶:从函数到文件的编程艺术!!!

第二章&#xff1a;Python进阶 模块概述 函数是一段可重复使用的代码块&#xff0c;它接受输入参数并返回一个结果。函数可以用于执行特定的任务、计算结果、修改数据等&#xff0c;使得代码更具模块化和可重用性。 模块是一组相关函数、类和变量的集合&#xff0c;它们被封…

第 2 章:Spring Framework 中的 IoC 容器

控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;与 面向切面编程&#xff08;Aspect Oriented Programming&#xff0c;AOP&#xff09;是 Spring Framework 中最重要的两个概念&#xff0c;本章会着重介绍前者&#xff0c;内容包括 IoC 容器以及容器中 …

Yum安装LAMP

查看当前80端口是否被占用 ss -tulanp | grep 80查询httpd是否在yum源中 yum info httpd安装httpd yum -y install httpd启动httpd服务&#xff0c;设置开机自启 systemctl enable httpd --now systemctl start httpd查看当前进程 ps aux | grep httpd查看当前IP&#xff…

自动化技术如何影响企业数据分析的发展

当今时代&#xff0c;企业普遍面临着转型的压力&#xff0c;这些挑战主要源于在科技和市场的双重压力下如何实现增长。当前&#xff0c;企业发展的趋势是紧追自动化的浪潮&#xff0c;并通过优化预算管理流程&#xff0c;推进系统和数据分析的现代化。在这一过程中&#xff0c;…