【基础算法总结】位运算

news2024/10/6 20:37:14

位运算

  • 1.基础位运算
  • 2.常见用法总结
  • 3.面试题 01.01. 判定字符是否唯一
  • 4.丢失的数字
  • 5.两整数之和
  • 6.只出现一次的数字 II
  • 7.面试题 17.19. 消失的两个数字

在这里插入图片描述

点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃

1.基础位运算

<<、>>、~、&、| 、^

& : 全为1才为1
| :有1就是1
^ :相同为0,相异为1。 或者无进位相加(不进位)

在这里插入图片描述

2.常见用法总结

1.位运算的优先级
能加括号的就加括号

2. 给一个数n,确定它的二进制表示中的第 x 位是0 还是 1

在这里插入图片描述
3.将一个数 n 的二进制表示的第 x 位修改成1

在这里插入图片描述
4. 将一个数 n 的二进制位表示的第 x 位修改成0

在这里插入图片描述
5.位图思想
位图主要借鉴哈希表的思想,哈希表是一个数组或者是一个数组里放链表但不管怎么用都是都一个类型。如果让存42亿个数肯定存不下,这个时候就要用位图了,最小消耗检查一个数据在不在,用比特位,1表示在,0表示不在。

6.提取一个数 n 二进制表示中最右侧的1 (lowbit)
在这里插入图片描述
n&(-n)
-n:将最右侧1,左边的区域全部变成相反

在这里插入图片描述
7.干掉一个数 n 二进制表示中最右侧的 1

n&(n-1)
n-1:将最右侧的1,右边区域(包括自己)全部变成相反

在这里插入图片描述
8.异或(^)运算的运算率

在这里插入图片描述

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

题目链接:面试题 01.01. 判定字符是否唯一

题目描述:

在这里插入图片描述

算法原理:

找一个数在不在第一时间应该想到的哈希表,这道题要求不适用额外的数据结构,并且字母都是小写的,因此自己可以写一个int hash[26],将字符一一相对映射。

解法一:哈希表

但是我们还可以更节省空间,记得C++学过的位图,它仅需一个比特位就可以判断一个数到底在不在,每个比特位有两种状态,1表示在,0表示不在
,并且这个范围仅有26个字母,一个int类型完全就够了,因此更节省空间
在这里插入图片描述

当然这里还用一个优化:鸽巢原理,假设就n个鸽巢,来了n+1个鸽子,那一定有一个鸽巢是有两只鸽子的。这里也是假设26个字母不重复,但是如果有27个字母那一定有重复!

class Solution {
public:
    bool isUnique(string astr) {

        // 利用鸽巢原理做优化
        if(astr.size()>26) return false;

        // 位图
        int bitmp=0;
        for(auto& ch:astr)
        {
            int i=ch-'a';
            //字符没出现就加入到位图
            if((bitmp & (1<<i)) == 0) 
                bitmp|=(1<<i);
            else 
                return false;//出现就返回
        }
        return true;
    }
};

4.丢失的数字

题目链接:268. 丢失的数字

题目描述:

在这里插入图片描述

0~n 应该是n+1个数,但现在只有n个数,肯定是缺了一个。我们要找的就是那个缺的数

算法原理:

解法一:排序+遍历

说到排序还有一种方法,排序之后发现二段性,左边数字和下标对应,右边数字和下标不对应并且右边区域最左端点就是缺少的数字,因此使用二分查找。
在这里插入图片描述
解法二:二分查找

上面的时间复杂度比下面高

解法三:哈希
在这里插入图片描述

解法四:高斯求和公式
在这里插入图片描述

解法五:位运算(异或运算的运算律)
将数组和下面0-n异或,最后一定是缺失的数字。
在这里插入图片描述
做法可以是数组里面先异或然后再和0~n异或,或者是数组和下标异或然后和n异或。

class Solution {
public:
    int missingNumber(vector<int>& nums) {

        int ret=0;
        //for(auto e:nums) ret^=e;
        //for(int i=0;i<=nums.size();++i) ret^=i;
        //return ret;
        for(int i=0;i<nums.size();++i)
        {
            ret^=nums[i]^i;
        }
        return ret^=nums.size();
    }
};

5.两整数之和

题目链接:371. 两整数之和

题目描述:

在这里插入图片描述

算法原理:

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

异或运算就是一个无进位相加的结果
在这里插入图片描述
如果我们在能把进制位加上不就是最终结果了吗。

在这里插入图片描述

我们的进位是要加到这个无进制位结果的不就是结果了吗,但是这里要求不能使用+号,因此我们要重复上面的工作,因为上面不就是a+b吗

在这里插入图片描述

class Solution {
public:
    int getSum(int a, int b) {

        while(b!=0)
        {
            int x=a^b;//先算出无进制位相加结果
            int array=(a&b)<<1;//算出进位
            a=x;
            b=array;
        }
        return a;
    }
};

6.只出现一次的数字 II

题目链接:137. 只出现一次的数字 II

题目描述:

在这里插入图片描述

算法原理:

如果不限制空间 可以使用计数排序。也可以用一个排序算法然后再遍历找一个只出现一次的数。但是这里限制空间了。时间O(N),空间O(1)。

解法:位运算

计算出单个数字的二进制每一位是多少。
由于其他数字出现3次且对应每个二进制位都是相等的,要不全0要不全1,把这些出现3次的比特位加起来肯定是3的倍数。要不就是3n个0,要不就是 3n个1。而单个数字的对应的二进制位要不是0要不是1。所以把所有元素对应的二进制位加起来再对3取余,就可以确定单个数字,对应每个二进制位是0还是1了。

在这里插入图片描述
并且这种做法还可以扩展求其余出现n次,抓出现一次的数。只要%n就可以了
在这里插入图片描述

class Solution {
public:
	int singleNumber(vector<int>& nums) {
	    int ret=0;
        for(int i=0;i<32;++i)
        {
            int sum=0;
            for(auto x:nums)
                if(((x>>i)&1) == 1)
                    ++sum;
            sum%=3;
            if(sum == 1) ret|=(1<<i);
        }
        return ret;
    }
};

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

题目链接:面试题 17.19. 消失的两个数字

题目描述:

在这里插入图片描述
一个数组消失了两个数字,原本是1~3 就剩下1了 ,原本1~4就剩下2,3了。

算法原理:
前面做过 丢失数字+只出现一次数字的||| 把它俩结合起来,这道题就非常容易了

首先利用丢失数字的思想来一个1~n的数组(包含丢失两个数的数组),然后将nums和这个数组放在一块,其他数字出现两次,还有两个数字只出现一次。让找出现一次的两个数组,这就转换成只出现一次数字||| 了。

在这里插入图片描述

解法:位运算

1.将所有的数异或在一起,tmp

2.找到tmp中,比特位为1 的那一位

因为a和b是不同的数,因此绝对可以找到tmp比特位为1的位置,因为异或只有相异为1,也就说明a和b该比特位是不同的,一个为0,一个为1.

3.根据 找到该比特位 x 的不同,将所有数划分成两类,然后在分别异或

在这里插入图片描述

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {

        // 1.将所有的数异或在一起
        int tmp=0;
        for(auto x:nums) tmp^=x;     
        for(int i=1;i<=nums.size()+2;++i) tmp^=i;

        // 2.找出 a,b 中比特位不同的哪一位
        //这里找的是最右侧比特位出现1的位置,也可以遍历去找
        int bit=tmp&(-tmp);

        // 3.根据 该比特位不同,将所有的数划分两类来异或
        int a=0,b=0;
        for(auto x:nums)
            if((x&bit) == 0) a^=x;
            else b^=x; 

        for(int i=1;i<=nums.size()+2;++i)
            if((i&bit) == 0) a^=i;
            else b^=i;

        return {a,b};
    }
};

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

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

相关文章

CCIG 2024:合合信息文档解析技术突破与应用前景

目录 背景当前大模型训练和应用面临的问题训练Token耗尽训练语料质量要求高LLM文档问答应用中文档解析不精准 合合信息的文档解析技术1. 具备多文档元素识别能力2. 具备版面分析能力3. 高性能的文档解析4. 高精准、高效率的文档解析文档多板式部分示例 文档解析典型技术难点元素…

Go Modules 使用

文章参考https://blog.csdn.net/wohu1104/article/details/110505489 不使用Go Modules&#xff0c;所有的依赖包都是存放在 GOPATH /pkg下&#xff0c;没有版本控制。如果 package 没有做到完全的向前兼容&#xff0c;会导致多个项目无法运行(包版本需求不同)。 于是推出了g…

JVM学习-类加载过程(一)

概述 在Java中数据类型分为基本数据类型和引用数据类型&#xff0c;基本数据类型由虚拟机预先定义&#xff0c;引用数据类型则需要进行类的加载按Java虚拟机规范&#xff0c;从class文件加载到内存中的类&#xff0c;到类卸载出内存为止&#xff0c;它的整个生命周期包含以下7…

Java 异常处理中try-catch块、finally子句以及自定义异常的使用

Java 异常处理是 Java 语言中非常重要的一部分&#xff0c;用来处理程序运行过程中可能发生的各种异常情况&#xff0c;确保程序的稳定性和可靠性。 一、Java 异常处理概述 异常是程序运行过程中出现的非正常情况。Java 使用异常类&#xff08;Exception 类及其子类&#xff…

建WordPress主题官网模板

蓝色的中文WordPress企业模板 https://www.zhanyes.com/qiye/6305.html 暗红色WordPress律师事务所网站模板 https://www.zhanyes.com/qiye/23.html 红色大banner图WordPress外贸网站模板 https://www.zhanyes.com/waimao/27.html

【C语言】探索文件读写函数的全貌

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 &#x1f525;引言 本章将介绍文件读取函数的相关知识和展示使用场景&am…

AI自动化办公:批量将Excel表格英文内容翻译为中文

有一个50列的表格&#xff0c;里面都是英文&#xff0c;要翻译成中文&#xff1a; 在ChatGPT中输入提示词&#xff1a; 你是一个开发AI大模型应用的Python编程专家&#xff0c;要完成以下任务的Python脚本&#xff1a; 打开Excel文件&#xff1a;"F:\AI自媒体内容\AI行业…

harbor -- docker私有仓库安装配置

1 安装docker-compose $ curl -L "https://get.daocloud.io/docker/compose/releases/download/v1.25.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose $ chmod x /usr/local/bin/docker-compose 2 安装配置harbor $ wget https://g…

JS-51-Node.js10-yarn

一、yarn的简介 Yarn 是一款 JavaScript 的包管理工具&#xff08;npm的代替方案&#xff09;&#xff0c;是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。 正如 Yarn 官网的介绍&#xff0c;Yarn 的具有速度快 、安全 、可靠 的优点&#x…

嘉立创使用gif

新建原理图 边框设置2 新建pcb图 放置焊盘 排列焊盘 新建符号 封号向导 新建封装 封装向导 符号与封装联结 原件查找 drc设计规则&#xff08;线之间的距离等 布线冲突 顶底层切换 T ,B 顶底连线&#xff0c;自动创造过孔 铺铜 泪滴 网格大小 吸附 元件库

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

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

任何图≌自己这一几何最起码常识推翻直线公理让R外标准实数一下子浮出水面

黄小宁 h定理&#xff1a;点集AB≌B的必要条件是A≌B。 证&#xff1a;若AB则A必可恒等变换地变为BA≌A&#xff0c;而恒等变换是保距变换。证毕。 如图所示R轴即x轴各元点x沿x轴正向不保距平移变为点y2x就使x轴沿本身拉伸&#xff08;放大&#xff09;变换为y2x轴不≌x轴&…

PDF盖骑缝章

在PDF文件上加盖骑缝章&#xff0c;您可以采取以下几种方法之一&#xff1a; 使用Adobe Acrobat&#xff1a; 打开Adobe Acrobat软件&#xff0c;加载PDF文件。在工具栏选择“工具”选项&#xff0c;找到“骑缝章”或“印章”工具。选择或上传您的骑缝章图片&#xff0c;将其放…

区块链技术:金融行业的信任基石

一、引言 在数字化转型的浪潮中,区块链技术以其独特的优势,正逐渐成为金融行业的信任基石。本文将深入探讨区块链技术在金融行业的应用,通过具体案例的细化和完善,分析其特点和影响。 二、区块链技术的核心特点 1. 去中心化:区块链技术通过分布式账本,实现去中心化的数…

乡村振兴,教育先行:加强农村教育事业发展,提高农民素质,培育新时代新型农民,为美丽乡村建设提供人才保障

目录 一、引言 二、农村教育事业发展的重要性 1、提高农民素质&#xff0c;促进全面发展 2、推动农村经济社会发展 3、传承乡村文化&#xff0c;促进文化振兴 三、加强农村教育事业发展的策略 1、加大教育投入&#xff0c;改善教育设施 2、普及义务教育&#xff0c;提高…

栈和队列题目练习

本节小编选了两道题来加深对栈和队列的认识理解&#xff01; 有效的括号 方法1&#xff1a;直接用栈的结构&#xff08;动态数组&#xff09; 本题可以用栈这个结构来解答&#xff0c;将(,{,[ 左括号压入栈中&#xff0c;然后取出栈顶元素与右括号),},]匹配。不匹配的话&…

雅特力串口485模式TCDT/TSDT说明

TCDT&#xff08;发送器完成延迟时间&#xff08;transmit complete delay time&#xff09;占了5个bit位&#xff0c;则最大值为 2 5 − 1 31 2^{5} -1 31 25−131&#xff0c;时间单位是 1 16 波特率周期 \frac{1}{16}波特率周期 161​波特率周期 波特率为9600&#xff…

如何理解 Java 接口和抽象类的定义和使用场景

Java 是一种面向对象编程语言&#xff0c;提供了丰富的面向对象编程机制。其中&#xff0c;接口和抽象类是两个重要的概念&#xff0c;它们在设计和实现代码时扮演着关键的角色。 接口&#xff08;Interface&#xff09; 定义和特性 接口是 Java 中的一种引用数据类型&#…

神经网络与深度学习——第4章 前馈神经网络

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第4章 前馈神经网络 前馈神经网络 神经元 Sigmoid型函数 Hard-Logistic函数和Hard-Tanh函数 ReLU函数 带泄露的ReLU 带参数的ReLU ELU函数 Softplus函数 Swish函数 GELU函数 Maxout单元 网络结构 前馈网络…

JAVAEE之多线程进阶(2)_ CAS概念、实现原理、ABA问题及解决方案

前言 在并发编程时&#xff0c;常常会出现线程安全问题&#xff0c;那么如何保证原子性呢&#xff1f;常用的方法就是加锁。在Java语言中可以使用 Synchronized和CAS实现加锁效果。  Synchronized关键字保证同步的&#xff0c;这会导致有锁&#xff0c;但是锁机制存在以下问题…