【优选算法 位运算】位运算算法入门详解:常见位运算总结

news2024/12/13 3:45:55

        

 


判定字符是否唯一


    题目解析   



     算法原理    


     解法一 :哈希数组    


从前往后扫描字符串,把扫描到的字符先进行判断,如果对应的 val = 0 ,则放入哈希表中,否则返回 false,知道扫描完整个字符;时间复杂度为 O(N),空间复杂度 O(N);

 我们不需要真的创建哈希表,只需要创建一个大小为26 的哈希数组,只要遍历到的元素,对应到的哈希元素+1;


    解法二 : 借助位图的思想     


单独一个 int 变量有32位:

 从 0 位到 25位分别代表从 a~z 26个小写字母,只要前面出现过,只要遍历到字符,对应的比特位就是1 ,否则为0;这里大量运用查询某一个比特位是否为1 ,以及将某一个比特位修改为1;

位运算算法入门详解:常见位运算总结


    优化:鸽巢(抽屉)原理        


【优选算法 — 双指针】双指针小专题,在这篇博客的证明快乐数成环有讲解鸽巢原理 

因为这道题有26个英文字母,当这个字符串长度 len > 26,就一定有重复字符;所以我们可以先判断字符串长度是否大于26;


    编写代码    


     解法一 :哈希数组     

    解法二 : 借助位图的思想     

 


丢失的数字 


    题目解析   


 


     算法原理    


     解法一 :哈希表    


因为要在 n+1 个数中找丢失的数,所以我们可以创建同等规模的哈希表,哈希表的key为 0到 n 这n+1个元素,在扫描一遍数组之后,返回 val=0 对应的key;时间复杂度O(N), 空间复杂度 O(N)


    解法二 : 高斯/等差数列求和     


时间复杂度O(N), 空间复杂度 O(1)


    解法三 : 位运算(异或^运算的运算律)     


我们把这一堆数(上下所有的数)全部异或在一起,所有数异或在一起,相同的数会消消乐,最终结果就是缺失的数;时间复杂度为O(N),空间复杂度O(1)


    编写代码    


     解法一 :哈希表     


     解法二 : 高斯/等差数列求和     


    解法三 : 位运算(异或^运算的运算律)     

为了方便理解两步循环的异或操作,我们简单举一个例子:

假设第一个循环是ret=1^2^3^5,第二个循环是ret=ret^1^2^3^4^5,那么通过异或的消消乐原理,最终计算的就是ret=1^1^2^2^3^3^4^5^5=4


两整数之和 


    题目解析   


 


     算法原理    


    解法 : 使用位运算(异或无进位相加)     


因为异或使用的是无进位相加;


所以接下来,我们需要把没有进位的位置找到:

  • 对于上图,如果两个数的同一位置进行相加,那么进位的结果只可能是1或者0;
  • 我们再整体来看这三行数据,发现蓝色的两行,通过按位与&,就可以得到下面红色的结果

所以接下来,我们只需要找到异或中的被消去的进位即可;


将这两行对应位的数字进行 按位与& 操作,即可找到异或中的被消去的进位;


但是需要注意的是,我们得到的进位,是进到&出结果的进一位:


 所以我们算出 a&b 的结果之后,要把结果<<1:


在求出进位之后,我们需要判断当前得到的 c^d 的过程是否还会有消去进位的情况:


如果还是存在消去进位的情况,我们就要重复上面的操作,先分别算出  c^d 和 (c&d)<<1 的结果;

继续 e^f ,此时就没有消去进位的情况,得到的就是最终的结果:

我们只需要以 (a&b)<<1 != 0  作为循环判断条件,对每次得到的进位结果进行判断,直到进位等于0,结束循环,最终的 a^b 即为最开始 a+b 的结果;


    过程总结    



    编写代码    





只出现一次的数字Ⅱ 


    题目解析   


 


     算法原理    


这道题的特点是,其中一个数出现一次,剩余所有的数出现三次;下图表示一个 int 类型的32位比特位:


任意一个比特位,会出现如下四种情况:


对四个数的32位比特位的某一位之和出现的四种情况进行剖析:


  我们发现,圈起来的数字,前后一 一对应 ;左边圈起来的数,表示只出现一次的那一个比特位,这个比特位,与四个比特位之和%3得到的结果相等


因此,我们创建一个返回值 ret,把这四个数的每一个比特位加起来,再模3,得到的结果放入 ret 对应的比特位上;

如果模3的结果为0,不用修改 ret 对应的比特位,如果模3 的结果为1 ,就把 ret 对应比特位修改为1 ,直到修改完 ret 的32位比特位即可;


拓展:如果一个数组中,有一个数出现一次,其他相同的数出现 n 次,我们的把模3修改成模n ,其他操作相同;


    编写代码    


 


 消失的两个数字


    题目解析   


 


     算法原理    


这道题的算法原理是丢失的数字+只出现一次的数字Ⅲ(不是Ⅱ)两个题的算法原理糅合在一起;


    解法:位运算    


 


我们回忆丢失的数字中的算法原理,就是把 nums 中的数和 0 ~ N 这所有的数都糅合在一起,通过异或来找出丢失的数,那么类比这道题:

 


将所有的数异或在一起,这些异或在一起的数,我们定义一个变量 tmp 来接收:

而通过异或消消乐的特性,最终 tmp = a ^ b,就是缺失的那两个数异或的结果;


接下来,我们要把 a ,b 分开,我们需要先找到 tmp 中,比特位为1 的那一位;为什么要找这一位呢?

因为 a 和 b 一定是不同的两个数, a^ b 的最终结果 tmp 绝对是不等于 0 的 ,所以在 tmp 的32位比特位上,肯定有二进制数为 1 的比特位,我们记录这个位置的下标为 x :

这个二进制数 1 的出现,是因为异或运算律:相同为0 ,相异为1,所以只要 tmp 中二进制位对应的二进制数为1,a ,b 对应的二进制位肯定是不同的;


那么,我们就可以根据 x 位的不同,对 a,b 划分成两个单独部分,对每个部分中的所有数进行异或:



    思考链路    


    总结    


    编写代码    


 


 

191. 位1的个数

338. 比特位计数

461. 汉明距离

136.只出现一次的数字

260.只出现一次的数字III


         

 

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

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

相关文章

深入理解Linux进程管理机制

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言 进程是现代操作系统中一个不可或缺的概念&#xff0c;其主要目的在于管理资源、实现并发、提高系统效率&#xff0c;并确保系统的稳定性和安全性。 进程的定义 进程&#xff08;Process&#xff09; 是计算机操作系统中…

R 语言科研绘图第 4 期 --- 折线图-置信区间

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

springSecurity自定义登陆接口和JWT认证过滤器

下面我会根据该流程图去自定义接口&#xff1a; 我们需要做的任务有&#xff1a; 登陆&#xff1a;1、通过ProviderManager的方法进行认证&#xff0c;生成jwt&#xff1b;2、把用户信息存入redis&#xff1b;3、自定义UserDetailsService实现到数据库查询数据的方法。 校验&a…

使用 LabVIEW 与 PLC 通信的方式

要将 PLC 与 LabVIEW 或其他 NI 产品进行通信&#xff0c;首先需要明确 PLC 支持的通信协议和接口类型。NI 提供了多种方案&#xff0c;包括 OPC 服务器、Modbus、Ethernet/IP 和其他工业通信协议。下面将详细介绍这些方法&#xff0c;并进行比较分析&#xff0c;帮助你选择最适…

软考高级架构-9.4.4-双机热备技术 与 服务器集群技术

一、双机热备 1、特点&#xff1a; 软硬件结合&#xff1a;系统由两台服务器&#xff08;主机和备机&#xff09;、一个共享存储&#xff08;通常为磁盘阵列柜&#xff09;、以及双机热备软件&#xff08;提供心跳检测、故障转移和资源管理功能的核心软件&#xff09;组成。 …

专题二十五_动态规划_两个数组的 dp (含字符串数组)_算法专题详细总结

目录 动态规划_两个数组的 dp &#xff08;含字符串数组&#xff09; 1. 最⻓公共⼦序列&#xff08;medium&#xff09; 解析&#xff1a; 1. 状态表⽰&#xff1a; 2. 状态转移⽅程&#xff1a; 3. 初始化&#xff1a;​编辑 4. 填表顺序&#xff1a;​编辑 5. 返回值…

12,攻防世界simple_php

simple_php 题目来源:Cyberpeace-n3k0 题目描述: 小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 进入靶场 这段PHP代码是一个简单的web应用示例&#xff0c;让我们逐步分析这段代码&#xff1a; show_source(__FILE__);&#xff1a;这行代码会显示当前文件的…

NIO - selector简单介绍

一 前言 selector作为NIO当中三大组件之一&#xff0c;是处理NIO非阻塞模式下的核心组件&#xff0c;它允许一个单个线程管理多个通道。 NIO下的阻塞模式 因为对于阻塞模式下的NIO模式&#xff0c;存在很大的问题&#xff0c;即使在单线程下&#xff0c;对应的服务端也会一直进…

二、部署docker

二、安装与部署 2.1 安装环境概述 Docker划分为CE和EE&#xff0c;CE为社区版&#xff08;免费&#xff0c;支持周期三个月&#xff09;&#xff0c;EE为企业版&#xff08;强调安全&#xff0c;付费使用&#xff09;。 Docker CE每月发布一个Edge版本&#xff08;17.03&…

Camp4-L2:LMDeploy 量化部署进阶实践

书生浦语大模型实战营第四期&#xff1a;LMDeploy 量化部署进阶实践 教程链接&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L2/LMDeploy视频链接&#xff1a;https://www.bilibili.com/video/BV18aUHY3EEG/?vd_sourceb96c7e6e6d1a48e73edafa36a36f1697…

Qt之第三方库QCustomPlot使用(二)

Qt开发 系列文章 - qcustomplot&#xff08;二&#xff09; 目录 前言 一、Qt开源库 二、QCustomPlot 1.qcustomplot介绍 2.qcustomplot下载 3.qcustomplot移植 4.修改项目文件.pro 5.提升QWidget类‌ 三、技巧讲解 1.拖动缩放功能 2.等待更新 总结 前言 Qt第三方…

python数据分析之爬虫基础:selenium详细讲解

目录 1、selenium介绍 2、selenium的作用&#xff1a; 3、配置浏览器驱动环境及selenium安装 4、selenium基本语法 4.1、selenium元素的定位 4.2、selenium元素的信息 4.3、selenium元素的交互 5、Phantomjs介绍 6、chrome handless模式 1、selenium介绍 &#xff08;1…

LearnOpenGL学习(模型加载 -- Assimp,网格,模型)

完整代码见&#xff1a;zaizai77/Cherno-OpenGL: OpenGL 小白学习之路 Assimp 3D建模工具如Blender、3DS Max在导出模型文件时&#xff0c;会自动生成所有的顶点坐标、顶点法线和纹理坐标。 .obj 格式只包含了模型数据和材质信息&#xff08;颜色、贴图等&#xff09; Assi…

qtcanpool 知 08:Docking

文章目录 前言口味改造后语 前言 很久以前&#xff0c;作者用 Qt 仿照前端 UI 设计了一个 ministack&#xff08;https://gitee.com/icanpool/qtcanpool/blob/release-1.x/src/libs/qcanpool/ministack.h&#xff09; 控件&#xff0c;这个控件可以折叠。部分用户体验后&#…

【Linux】文件管理必备知识和基本指令

【Linux】文件管理必备知识和基本指令 什么是操作系统什么是文件什么是路径01. ls 指令02. pwd命令03. cd 指令04. touch指令05.mkdir指令&#xff08;重要&#xff09;&#xff1a;06.rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a;rmdir指令rm指令 0…

R155 VTA 认证对汽车入侵检测系统(IDS)合规要求

续接上集“浅谈汽车网络安全车辆型式认证&#xff08;VTA&#xff09;的现状和未来发展”&#xff0c;有许多读者小伙伴有联系笔者来确认相关的R155 VTA网络安全审核要求&#xff0c;基于此&#xff0c;笔者将针对 R155 VTA 每一条网络安全审核细则来具体展开。 今天就先从汽车…

【PHP项目实战】活动报名系统

目录 项目介绍 开发语言 后端 前端 项目截图&#xff08;部分&#xff09; 首页 列表 详情 个人中心 后台管理 项目演示 项目介绍 本项目是一款基于手机浏览器的活动报名系统。它提供了一个方便快捷的活动报名解决方案&#xff0c;无需下载和安装任何APP&#xff0c…

【数据分享】1901-2023年我国省市县三级逐年最低气温数据(Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最低气温栅格数据和Excel和Shp格式的省市县三级逐月最低气温数据&#xff0c;原始的逐月最低气温栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据&#xff01;基于逐月栅格数据我们采用求年平均值的方法得到逐年最…

使用伪装IP地址和MAC地址进行Nmap扫描

使用伪装IP地址和MAC地址进行Nmap扫描 在某些网络设置中&#xff0c;攻击者可以使用伪装的IP地址甚至伪装的MAC地址进行系统扫描。这种扫描方式只有在可以保证捕获响应的情况下才有意义。如果从某个随机的网络尝试使用伪装的IP地址进行扫描&#xff0c;很可能无法接收到任何响…

【趣题分享】赤壁之战每日演兵(原诸葛亮列传兵法题)求解算法

文章目录 序言1 求解算法代码&#xff08;python&#xff09;2 思路细节2.1 定义拼图与阵型2.2 穷举复杂度2.3 使用缓存进行改进&#xff08;&#xff09;2.3.1 LRU缓存2.3.2 将2.2的solve函数改写为可缓存装饰的 2.4 使用剪枝进行改进&#xff08;&#xff09;2.5 使用更好的状…