【优选算法之位运算】No.7--- 经典位运算算法

news2024/9/25 5:07:12

文章目录

  • 前言
  • 一、位运算几种模型:
    • 1.1 基础的位运算: << >> ~ & | ^
    • 1.2 几种模型:
    • 1.3 模型练习
  • 二、位运算示例:
    • 2.1 判定字符是否唯⼀
    • 2.2 丢失的数字
    • 2.3 两整数之和
    • 2.4 只出现⼀次的数字 II
    • 2.5 消失的两个数字


前言

在这里插入图片描述

👧个人主页:@小沈YO.
😚小编介绍:欢迎来到我的乱七八糟小星球🌝
📋专栏:优选算法
🔑本章内容:位运算
记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~


一、位运算几种模型:

1.1 基础的位运算: << >> ~ & | ^

1.2 几种模型:

  • 给一个数n确定它的二进制表示中的第x位是0还是1 ===> (n>>x)&1
  • 将一个数n的二进制表示的第x位修改为1 ===> n|=(1<<x)
  • 将一个数n的二进制表示的第x位修改成0 ===> n&=(~(1<<x))
  • 位图思想 ===> 一个数字的二进制的每一位可以存储0或者1来表示模拟实现哈希
  • 提取一个数n的二进制表示中最右侧的1 ===> n&(~n) (-n《= =》 n取反+1)
  • 干掉一个数n的二进制表示中最右侧的1 ===> n&(n-1)
  • 异或运算的运算律 ===> (1) a ^ 0 = 0 (2) a ^ a = 0 (3) a ^ b ^ c = a ^ (b ^ c)

1.3 模型练习

  • 191. 位1的个数
  • 338. 比特位计数
  • 461. 汉明距离
  • 136. 只出现一次的数字
  • 260. 只出现一次的数字 III

二、位运算示例:

2.1 判定字符是否唯⼀

  1. 题⽬链接:⾯试题 01.01. 判定字符是否唯⼀
  2. 题⽬描述:
    在这里插入图片描述
  3. 解法(位图的思想):
    算法思路:
    利⽤「位图」的思想,每⼀个「⽐特位」代表⼀个「字符,⼀个 int 类型的变量的 32 位⾜够表⽰所有的⼩写字⺟。⽐特位⾥⾯如果是 0 ,表⽰这个字符没有出现过。⽐特位⾥⾯的值是 1 ,表⽰该字符出现过。那么我们就可以⽤⼀个「整数」来充当「哈希表」。
  4. C++代码
class Solution {
public:
    bool isUnique(string astr) 
    {
    	if(astr.size() > 26) return false;
        int ret=0;
        for(auto&e:astr)
        {
            if((ret>>(e-'a')&1)==1)return false;
            else
            ret|=(1<<(e-'a'));
        }
        return true;
    }
};

2.2 丢失的数字

  1. 题⽬链接:268. 丢失的数字

  2. 题⽬描述:
    在这里插入图片描述

  3. 解法(位运算):
    算法思路:
    设数组的⼤⼩为 n ,那么缺失之前的数就是 [0, n] ,数组中是在 [0, n] 中缺失⼀个数形成的序列。
    如果我们把数组中的所有数,以及 [0, n] 中的所有数全部「异或」在⼀起,那么根据「异或」运算的「消消乐」规律,最终的异或结果应该就是缺失的数~

  4. C++代码

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

2.3 两整数之和

  1. 题⽬链接:371. 两整数之和
  2. 题⽬描述:
    在这里插入图片描述
  3. 解法(位运算):
    算法思路:
    ◦ 异或 ^ 运算本质是「⽆进位加法」;
    ◦ 按位与 & 操作能够得到「进位」; 比如3&5 = = => 011&101= = =>001也就是同为1的时候相加会有进位但是这个进位要进给前一个位置所以还要右移1位
    ◦ 然后⼀直循环进⾏,直到「进位」变成 0 为⽌
  4. C++代码
class Solution {
public:
    int getSum(int a, int b) 
    {
        while(b)
        {
            int x=a^b;
            unsigned int y=(unsigned int)(a&b)<<1;
            a=x;
            b=y;
        }
        return a;
    }
};

2.4 只出现⼀次的数字 II

  1. 题⽬链接:137. 只出现⼀次的数字 II
  2. 题⽬描述:
    在这里插入图片描述
  3. 解法(⽐特位计数):
    算法思路:
    设要找的数位 ret 。
    由于整个数组中,需要找的元素只出现了「⼀次」,其余的数都出现的「三次」,因此我们可以根据所有数的「某⼀个⽐特位」的总和 %3 的结果,快速定位到 ret 的「⼀个⽐特位上」的值是 0 还是 1 。 这样,我们通过 ret 的每⼀个⽐特位上的值,就可以将 ret 给还原出来。
  4. C++代码
class Solution {
public:
    int singleNumber(vector<int>& nums) 
    {
        int ret=0;
        for(int i=0;i<32;i++)
        {
            int sum=0;
            for(auto&e:nums)
            {
                if((e>>i)&1==1)sum++;
            }
            sum%=3;
            if(sum==1)ret|=(1<<i);
        }
        return ret;
    }
};

2.5 消失的两个数字

  1. 题⽬链接:⾯试题 17.19. 消失的两个数字
  2. 题⽬描述:
    在这里插入图片描述
  3. 解法(位运算):
    算法思路:
    本题就是 268. 丢失的数字 + 260. 只出现⼀次的数字 III 组合起来的题。 先将数组中的数和 [1, n + 2] 区间内的所有数「异或」在⼀起,问题就变成了:有两个数出现了「⼀次」,其余所有的数出现了「两次」。进⽽变成了 260. 只出现⼀次的数字 III 这道题。
  4. C++代码
class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) 
    {
        int n=nums.size()+2;
        int ret=0;
        for(int i=1;i<=n;i++)
            ret^=i;
        for(auto&e:nums)ret^=e;
        int l=0;
        for(int i=0;i<32;i++)
        {
            if(((ret>>i)&1)==1)
            {
                l=i;
                break;
            }
        }
        int a=0,b=0;
        for(auto&e:nums)
        {
            if(((e>>l)&1)==1)a^=e;
            else b^=e;
        }
        for(int i=1;i<=n;i++)
        {
            if(((i>>l)&1)==1)a^=i;
            else b^=i;
        }
        return {a,b};
    }
};

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

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

相关文章

frp内网穿透服务器+客户端详细配置

当我们拥有一台云服务器时&#xff0c;可以将局域网服务器的服务通过内网穿透发布到公网上。frp是一个主流的内网穿透软件&#xff0c;本文讲解frp内网穿透服务器客户端详细配置。 一、需要准备的内容&#xff1a; 腾讯云服务器&#xff1a;https://curl.qcloud.com/Sjy0zKjy 2…

【图文详解】什么是微服务?什么是SpringCloud?

目录 一.认识微服务架构 ▐ 微服务带来的挑战 二.微服务解决方案SpringCloud ▐ SpringCloud的版本 ▐ SpringCloud和SpringBoot的关系 ▐ SpringCloud实现方案 Spring Cloud Netfix Spring Cloud Alibaba ▐ Spring Cloud 实现对比 在入门Spring Cloud 之前&#xff…

太速科技-383-基于kintex UltraScale XCKU060的双路QSFP+光纤PCIe 卡

基于kintex UltraScale XCKU060的双路QSFP光纤PCIe 卡 一、板卡概述 本板卡系我司自主研发&#xff0c;基于Xilinx UltraScale Kintex系列FPGA XCKU060-FFVA1156-2-I架构&#xff0c;支持PCIE Gen3 x8模式的高速信号处理板卡&#xff0c;搭配两路40G QSFP接口&#xff…

DataX3.0:深入探索与实战应用

DataX3.0是阿里云DataWorks数据集成的开源版本&#xff0c;它继承了DataX1.0的优良基因&#xff0c;并在此基础上进行了全面的升级和扩展。新版本的DataX3.0不仅支持更多的数据源和目标端&#xff0c;还提供了更高效的数据同步能力&#xff0c;能够满足企业在数据迁移、数据同步…

虚拟硬盘数据恢复(vmdk、vdi、vhd等虚拟磁盘文件)

我们用的虚拟机有时候用着用着就启动不起来了&#xff0c;可能是操作系统启动扇区出了问题或者硬盘数据损坏。如果还有重要的数据文件在虚拟机里面&#xff0c;不要慌&#xff0c;一般只是操作系统的问题&#xff0c;硬盘里面的文件一般是不会丢失损坏的&#xff0c;即使磁盘有…

【论文阅读】RISE: 3D Perception Makes Real-World Robot Imitation Simple and Effective

Abstract 在模仿学习中&#xff0c;精确的机器人操作需要丰富的空间信息。基于图像的policies模型对象位置来自固定摄像头&#xff0c;对摄像头视图变化很敏感。利用3d点云的策略通常预测关键帧而不是连续动作&#xff0c;这在动态和联系人丰富的场景中造成了困难。为了有效地…

C++核心编程和桌面应用开发 第六天(this指针 友元)

目录 1.this指针 1.1C中空类的大小 1.2类中成员的存储方式 1.3this指针 1.3.1常函数 1.3.2常对象 2.友元 2.1全局函数做友元 2.2类做友元 2.3成员函数做友元 1.this指针 1.1C中空类的大小 1.2 类中成员的存储方式 1.3this指针 this指针指向被调用的成员函数所属的对…

Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类

引言 本文基于Python仿真的电能质量扰动信号&#xff0c;先经过数据预处理进行数据集的制作和加载&#xff0c;然后通过Pytorch实现LSTM模型对扰动信号的分类。Python仿真电能质量扰动信号的详细介绍可以参考下文&#xff08;文末附10分类数据集&#xff09;&#xff1a; Pyth…

详解机器学习经典模型(原理及应用)——支持向量机

一、什么是支持向量机 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种强大的机器学习算法&#xff0c;可用于解决数据分类&#xff08;二分类&#xff09;和回归问题。在分类问题上&#xff0c;SVM的核心思想是在特征空间中找到一个最优的超平面&#x…

Bootstrap框架-container类,container-fluid类,栅格系统

1.Bootstrap Bootstrap为页面内容和栅格系统包裹了一个.container容器&#xff0c;框架预先定义类 1.1container类 响应式布局容器的宽度 手机-小于768px 宽度设置100%&#xff1b; 平板-大于等于768px 设置宽度为750px 桌面显示器-大于等于992px 设置宽度 970px 大屏幕显…

【全网最全】2024年华为杯研赛A题成品论文获取入口(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024年华为杯研赛A题保奖思路matlab/py代码成品论文等&#xff08;后续会更新完整 点击链接加入【2024华为杯研赛资料汇总】&#xff1a;https:…

linux驱动开发-arm汇编基础

目录 写在前面 1、Cortex-A7 处理器有 9 种处理模式 2、Cortex-A 寄存器组 通用寄存器 1、汇编语法 2、Cortex-A7 常用汇编指令 2.1 处理器内部数据传输指令 2.1.1 传输数据操作类型 1、MOV指令 2、MRS指令 3、MSR指令 2.2、存储器访问指令 2.2.1 LDR指令 2.2.2 …

IDEA:如何设置项目启动的JVM运行内存大小

IDEA版本不一样页面也不一样 -Xms20m -Xmx200m 其实在本地开发调试的时候不需要太大内存&#xff0c;如果测试性能建议放到运算服务器上面去跑~~~

最小花费爬楼梯(动态规划)问题

目录 一题目&#xff1a; 二思路&#xff1a; 三代码&#xff1a; 一题目&#xff1a; 最小花费爬楼梯_牛客题霸_牛客网 二思路&#xff1a; 思路&#xff1a;动态规划找前后规律化简题意&#xff1a;此题想要的结果其实就是能上到顶楼也就是&#xff1a; 分为&#xff1…

信息安全工程师(16)密码学概况

前言 密码学是研究编制密码和破译密码的技术科学&#xff0c;它涵盖了加密技术和解密技术的各个方面&#xff0c;是现代信息安全的核心组成部分。 一、定义与基本概念 定义&#xff1a;密码学是研究如何隐密地传递信息的学科&#xff0c;主要涉及保密通信和数字签名两个方面。它…

4.1章节python中顺序结构

顺序结构&#xff08;Sequential Structure&#xff09;是最基本、最简单的程序结构。 顺序结构意味着程序中的语句将按照它们在代码中出现的顺序依次执行。这是大多数编程语言中最直观和自然的执行方式。 在Python中编写顺序结构的程序时&#xff0c;你只需将语句按照你希望它…

docker:docker-compose容器编排

docker-compose容器编排 安装docker-compose 下载链接&#xff1a;https://github.com/docker/compose/releases/下载这个版本 [rootc1-10-66 ~]# ls anaconda-ks.cfg docker-compose-linux-x86_64_2 gpu-burn## 改个名字 [rootc1-10-66 ~]# mv docker-compose-linux-x86…

联想2025届C++开发工程师(编程题AK)

前面20个选择题吧 编程题 T1、爆破 时间限制&#xff1a;3000MS 内存限制&#xff1a;589824KB 题目描述&#xff1a; 小明当起了矿场的爆破工程师。小明工作的矿场可以看作一个N x N的二维网格&#xff0c;小明可以将一个炸弹放置到矿场的任意位置&#xff0c;若干时间后…

更新C语言题目

1.以下程序输出结果是() int main() {int a 1, b 2, c 2, t;while (a < b < c) {t a;a b;b t;c--;}printf("%d %d %d", a, b, c); } 解析:a1 b2 c2 a<b 成立 ,等于一个真值1 1<2 执行循环体 t被赋值为1 a被赋值2 b赋值1 c-- c变成1 a<b 不成立…

CSS——网格布局(display: grid)之下篇

CSS——网格布局&#xff08;display: grid&#xff09;之下篇 前面我们介绍了网格布局的基础的创建以及一些比较基础的属性&#xff0c;下面我们将介绍网格布局的剩余部分&#xff0c;还将结合实例来进行细致的讲解&#xff08;图文并茂&#xff0c;生动形象有内涵&#xff0…