算法5--位运算

目录

  • 基础
  • 经典例题
    • [面试题 01.01. 判定字符是否唯一](https://leetcode.cn/problems/is-unique-lcci/description/)
    • [268. 丢失的数字](https://leetcode.cn/problems/missing-number/description/)
    • [371. 两整数之和](https://leetcode.cn/problems/sum-of-two-integers/description/)
    • [137. 只出现一次的数字 II](https://leetcode.cn/problems/single-number-ii/description/)
    • [面试题 17.19. 消失的两个数字](https://leetcode.cn/problems/missing-two-lcci/description/)

基础

基本的位运算符有:

<<  >>  ^  ~  &  |

对于这些位运算之间的优先级没有必要记忆,统一加括号即可。
异或操作就是进行无进位相加,有以下规律:

a^0=a
a^a=0
a^b=b^a
a^b^a=b

下面总结一下使用这些位运算符常见的操作:

  1. 求一个整数n的二进制位的第x(0开始)个比特位是0还是1
(n>>x)&1
  1. 将一个整数的二进制位的第x位改为0
n=n&(~(1<<x))
  1. 将一个整数的二进制位的第x位改为1
n=n|(1<<x)
  1. 提取出整数n最右侧的1
n=n&(-n)

在这里插入图片描述
取负数后,最右侧的1所在位置左侧的比特位都取反了,右侧的及当前位置的比特位数保持不变,且右侧位置的比特位全是0

  1. 去除整数n最右侧的1
n=n&(n-1)

在这里插入图片描述
n-1会向n中最右侧的1借1,从而将其置0,该位置左侧的比特位保持不变,右侧比特位全置1,且在n中该位置右侧比特位是全0

  1. 位图

使用一个比特位(也可以多个)标识数据的状态,要根据具体问题实现

经典例题

面试题 01.01. 判定字符是否唯一

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
0 <= len(s) <= 100
s[i]仅包含小写字母
如果你不使用额外的数据结构,会很加分。

解法一:使用一个哈希表
解法二:使用一张位图,由于只有26个字符,因此使用一个32位整型类型作为位图即可

class Solution {
public:bool isUnique(string astr) {if(astr.size() > 26){return false;} int bitMap = 0;int i = 0;for (; i < astr.size(); ++i) {int tmp = 1 << (astr[i] - 'a');if (bitMap & tmp) {return false;}bitMap |= tmp;}return true;}
};

268. 丢失的数字

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

解法一:利用等差数列求和公式对[0,n]求和得到sum,sum在减去nums的和即可

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

解法二:利用规律a^a=0,a^0=a,先对[0,n]一一异或得到tmp,再用tmp和nums一一异或即可得到缺失的数字

int missingNumber(int* nums, int numsSize)
{int missnum=0;int i=numsSize+1;while(i--){missnum^=i;}i=numsSize;while(i--){missnum^=nums[i];}return missnum;
}

371. 两整数之和

给你两个整数 a 和 b ,不使用 运算符 + 和 - ​​​​​​​,计算并返回两整数之和。

解法1:利用位运算符模拟二进制加法过程

class Solution {
public:int getSum(int a, int b) {int ans=0;int tmp=0;//进位int i=0;for(;i<32;++i){int t1=1&(a>>i);int t2=1&(b>>i);if((t1||t2||tmp)&&(!((t1&&t2&&!tmp)||(tmp&&t2&&!t1)||(tmp&&t1&&!t2)))){ans|=1<<i;tmp=0;}if((t1&&t2)||(t1&&tmp)||(t2&&tmp)){tmp=1;}}return ans;}
};

解法二:a^b就得到a和b的无进位相加m,(a&b)<<1就得到a和b的进位n,可以令a=m,b=n,重复以上过程,直到进位n为0为止

class Solution {
public:int getSum(int a, int b) {while(b){int m=a^b;int n=(a&b)<<1;a=m;b=n;}return a;}
};

137. 只出现一次的数字 II

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

记录所有的整数对应的比特位为1的频率,将这些频率进行模3运算,得到的就是只出现一次的整数对应的比特位

class Solution {
public:int singleNumber(vector<int>& nums) {vector<int> bit(32,0);int i=0;for(;i<nums.size();++i){int j=0;for(;j<32;++j){bit[31-j]+=1&(nums[i]>>j);bit[31-j]%=3;}}int ans=0;for(i=0;i<32;++i){ans|=bit[i]<<(31-i);}return ans;}
};

面试题 17.19. 消失的两个数字

给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?
以任意顺序返回这两个数字均可。

假设缺的数字是a和b,先对[1,N]异或得到tmp,再用tmp对数组nums一一异或得到的结果就是a^b,由于a和b是不同的两个数字,那么a^b一定有一个比特位为1,假设a^b的第x个比特位为1,现在[0,N]分为第x个比特位为0和为1的两组数字tmp1和tmp2,再将数组nums也分为第x个比特位为0和为1的两组数字nums1和nums2,此时将tmp1和nums1的数字一一异或即可得到a,将tmp2和nums2的数字一一异或即可得到b

class Solution {
public:vector<int> missingTwo(vector<int>& nums) {int tmp = 0; // a^bint i = 0;for (i = 1; i <= nums.size() + 2; ++i) {tmp ^= i;}for (i = 0; i < nums.size(); ++i) {tmp ^= nums[i];}// 寻找xint x = 0;while (x < 32) {if (tmp & (1 << x)) {break;}++x;}// 分组得到a和bint a = 0;int b = 0;for (i = 1; i <= nums.size() + 2; ++i) {if (i & (1 << x)) {b ^= i;} else {a ^= i;}}for (i = 0; i < nums.size(); ++i) {if (nums[i] & (1 << x)) {b ^= nums[i];} else {a ^= nums[i];}}return {a, b};}
};

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

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

相关文章

基于STM32设计的仓库环境监测与预警系统

目录 项目开发背景设计实现的功能项目硬件模块组成设计思路系统功能总结使用的模块的技术详情介绍总结 1. 项目开发背景 随着工业化和现代化的进程&#xff0c;尤其是在制造业、食品业、医药业等行业&#xff0c;仓库环境的监控和管理成为了至关重要的一环。尤其是在存储易腐…

代码随想录day38 动态规划6

题目&#xff1a;322.零钱兑换 279.完全平方数 139.单词拆分 多重背包 背包总结 需要重做&#xff1a;322&#xff0c;139 322. 零钱兑换 思路&#xff1a;零钱&#xff0c;可取多次-》完全背包。 注意&#xff1a; 五部&#xff1a; 1.dp[j]:价值为j的时候&#xff0c;最…

HackMyVM-Again靶机的测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Getshell 3、提权 四、结论 一、测试环境 1、系统环境 渗透机&#xff1a;kali2021.1(192.168.101.127) 靶 机&#xff1a;Linux(192.168.101.204) 物理机&#xff1a;wi…

UDP_TCP

目录 1. 回顾端口号2. UDP协议2.1 理解报头2.2 UDP的特点2.3 UDP的缓冲区及注意事项 3. TCP协议3.1 报头3.2 流量控制2.3 数据发送模式3.4 捎带应答3.5 URG && 紧急指针3.6 PSH3.7 RES 1. 回顾端口号 在 TCP/IP 协议中&#xff0c;用 “源IP”&#xff0c; “源端口号”…

Android存储方案对比(SharedPreferences 、 MMKV 、 DataStore)

简介&#xff1a;本文介绍了Android开发中常用的键值对存储方案&#xff0c;包括SharedPreferences、MMKV和DataStore&#xff0c;并且对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例&#xff0c;帮助开发者根据项目需求选择最适合的存储方案&#xff…

Unity-Mirror网络框架-从入门到精通 总目录

前言 在现代游戏开发中&#xff0c;网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解&#xff0c;涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开源网络框架&#xff0c;专为多人游戏开发设计&#xff0c;它使得开发者…

element输入框及表单元素自定义前缀

如图所示&#xff1a; <el-input class"custom-input" placeholder"请输入" prefix-icon"prefix" v-model"form.name" clearable></el-input> :deep(.custom-input) {.el-input__icon {display: inline-block;width: 40…

现代谱估计的原理及MATLAB仿真(二)(AR模型法、MVDR法、MUSIC法)

现代谱估计的原理及MATLAB仿真AR参数模型法&#xff08;参数模型功率谱估计&#xff09;、MVDR法&#xff08;最小方差无失真响应法&#xff09;、MUSIC法&#xff08;多重信号分类法&#xff09; 文章目录 前言一、AR参数模型1 原理2 MATLAB仿真 二、MVDR法1 原理2 MATLAB仿真…

对话|全年HUD前装将超330万台,疆程技术瞄准人机交互“第一屏”

2024年&#xff0c;在高阶智驾进入快速上车的同时&#xff0c;座舱人机交互也在迎来新的增长点。Chat GPT、AR-HUD、车载投影等新配置都在带来新增量机会。 高工智能汽车研究院监测数据显示&#xff0c;2024年1-10月&#xff0c;中国市场&#xff08;不含进出口&#xff09;乘用…

LabVIEW之树形控件

一、树形控件基本构成 树形控件这个名称非常形象&#xff0c;其如同树一样&#xff0c;是典型的分层结构。树形控件的属性和方法使用非常灵活&#xff0c;树形控件的内容既可以静态编辑&#xff0c;也可以通过编程来动态填充。静态编辑树形控件适用于内容不变的应用场景&#…

springboot 集成 etcd

springboot 集成 etcd 往期内容 ETCD 简介docker部署ETCD 前言 好久不见各位小伙伴们&#xff0c;上两期内容中&#xff0c;我们对于分布式kv存储中间件有了简单的认识&#xff0c;完成了docker-compose 部署etcd集群以及可视化工具 etcd Keeper&#xff0c;既然有了认识&a…

gateway的路径匹配介绍

gateway是一个单独服务。通过网关端口和predicates进行匹配服务 1先看配置。看我注解你就明白了。其实就是/order/**配置机制直接匹配到orderservice服务。 2我试着请求一个路径&#xff0c;请求成功。下面第三步是请求的接口。 3接口。

嵌入式中QT实现文本与线程控制方法

第一:利用QT进行文件读写实现 利用QT进行读写文本的时候进行读写,读取MP3歌词的文本,对这个文件进行读写操作。 实例代码,利用Qfile,对文件进行读写。 //读取对应文件文件,头文件的实现。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #incl…

书籍推荐:Kubernetes 修炼手册

这本书是 2020 年出版的&#xff0c;比较新&#xff0c;从 0 到 1 介绍了 k8s 中的相关技术和概念&#xff0c;翻译质量也可以&#xff0c;适合作为初学 k8s 的课外书。 书中比较关键的就是中间那几个章节&#xff0c;基本掌握 k8s 中 Pod、svc、StatefulSet、ConfigMap、Volum…

计算机网络 (29)网络地址转换NAT

前言 网络地址转换&#xff08;Network Address Translation&#xff0c;NAT&#xff09;是计算机网络中的一种重要协议&#xff0c;它主要用于将私有IP地址转换为公共IP地址&#xff0c;以实现内部网络与外部网络之间的通信。 一、基本概念 NAT是一种在局域网&#xff08;LAN&…

三极管工作状态分析

NPN三极管 下面是NPN三极管&#xff08;也称N管&#xff09;的标识和内部结构图&#xff1a; NPN三极管由两个PN结构成&#xff0c;靠近C&#xff08;集电极&#xff09;一侧的PN结称为集电结&#xff1b;靠近E&#xff08;发射极&#xff09;一侧的PN结称为发射结&#xff1…

基于RedHat9部署WordPress+WooCommerce架设购物网站

系统版本信息&#xff1a;Red Hat Enterprise Linux release 9.2 (Plow) WordPress版本信息&#xff1a;wordpress-6.6.2-zh_CN WooCommerce版本信息&#xff1a;woocommerce.9.5.1 环境架构&#xff1a;LNMP&#xff08;RedHat9nginx1.20.1PHP 8.0.27MySQL8.0.30&#xff09; …

【雷达】雷达的分类

文章目录 前言类别性质主要雷达分系统及其现代技术发展国外发展 前言 前言 类别 性质 按作用分类 军用雷达&#xff1a;&#xff08;按载体&#xff09;地面雷达、舰载雷达、机载雷达、星载雷达、 艇载雷达、弹载雷达 民用雷达&#xff1a;交通管制雷达、港口管制雷达、气象雷…

基于RK3568/RK3588大车360度环视影像主动安全行车辅助系统解决方案,支持ADAS/DMS

产品设计初衷 HS-P2-2D是一款针对大车盲区开发的360度全景影像 安全行车辅助系统&#xff0c;通过车身四周安装的超广角像机&#xff0c;经算法合成全景鸟瞰图&#xff0c;通过鸟瞰图&#xff0c;司机非常清楚的看清楚车辆四周情况&#xff0c;大大降低盲区引发的交通事故。 产…

微信小程序之历史上的今天

微信小程序之历史上的今天 需求描述 今天我们再来做一个小程序&#xff0c;主要是搜索历史上的今天发生了哪些大事&#xff0c;结果如下 当天的历史事件或者根据事件选择的历史事件的列表&#xff1a; 点击某个详细的历史事件以后看到详细信息&#xff1a; API申请和小程序…