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

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

文章目录

目录

文章目录

前言

一. 常见位运算总结

二、常见位运算题目

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
            // 否则在该位置上一定是1
            if (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……00
       for(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.mfbz.cn/a/715981.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QtScrcpy最出色的C++开源手机投屏控制软件

QtScrcpy是一款开源的跨平台屏幕录制和投屏工具 基本概述&#xff1a; 它基于Android的ADB&#xff08;Android Debug Bridge&#xff09;和Electron框架&#xff0c;为用户提供了简洁且功能强大的用户界面。 支持平台&#xff1a; QtScrcpy支持Windows、macOS和Linux三大…

算力与能源正在成为世界的硬通货,看超级计算机安腾如何突围

特斯拉创始人马斯克公开表态称未来两年人工智能行业将由“缺硅”变为“缺电”。据媒体报道&#xff0c;OpenAI的ChatGPT每天消耗超过50万千瓦时的电力&#xff0c;用于处理约2亿个用户请求&#xff0c;相当于美国家庭每天用电量的1.7万多倍。除了这类生成式AI耗能外&#xff0c…

【Linux】使用 iptables 验证访问HDFS 所使用到的端口

目录 ​编辑 一、实操背景 二、iptables 简介 三、模拟操作 一、实操背景 背景&#xff1a; 在客户有外网的服务器需要访问内网大数据集群HDFS&#xff0c;使用iptable模拟测试需要开放的端口。 二、iptables 简介 具体介绍看文章&#xff1a; 【Linux】Iptables 详解与实战…

Elasticsearch出现Connection reset by peer

Elasticsearch出现Connection reset by peer分析 1.异常&#xff1a; 2024-06-13 13:17:10.539 WARN [http-nio-30411-exec-9]com.longdaotech.config.ESConfig -onFailure node:[hosthttp://192.168.239.253:9200] 2024/6/13 13:17:10 2024-06-13 13:17:10.541 WARN [http-n…

aop注解快速实现数据脱敏返回

说明&#xff1a; 公司之前数据接口数据管理不严格&#xff0c;很多接口的敏感数据都没有脱敏处理&#xff0c;直接返回给前端了&#xff0c;然后被甲方的第三方安全漏洞扫出来&#xff0c;老板要求紧急处理&#xff0c;常用的话在单个字段上加上脱敏注解会更加的灵活&#xf…

Win11升级24H2出现绿屏怎么办?这些方法帮你解决!

在Win11电脑操作中&#xff0c;用户为了体验24H2版本推出的新功能&#xff0c;所以要把系统版本升级为24H2版本。但升级过程中电脑却出现了绿屏问题&#xff0c;不清楚要怎么操作才能解决绿屏的问题&#xff1f;接下来小编给大家分享几种简单有效的解决方法&#xff0c;让大家能…

轨迹优化 | 图解欧氏距离场与梯度场算法(附ROS C++/Python实现)

目录 0 专栏介绍1 什么是距离场&#xff1f;2 欧氏距离场计算原理3 双线性插值与欧式梯度场4 仿真实现4.1 ROS C实现4.2 Python实现 0 专栏介绍 &#x1f525;课程设计、毕业设计、创新竞赛、学术研究必备&#xff01;本专栏涉及更高阶的运动规划算法实战&#xff1a;曲线生成…

基于Java和SSM框架的多人命题系统

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果你对多人命题系统感兴趣或者有相关开发需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java SSM框架 工具&#xff1a;Eclipse、MySQL Workbench、…

大众点评_token,mtgsig

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未经许可禁止转载&#xff0…

springboot“漫画之家”系统 LW+PPT+源码

3 系统分析 链接&#xff1a;https://pan.baidu.com/s/1ihILTui-XEFdC15mcOB0vA?pwdewry 提取码&#xff1a;ewry 3.1系统可行性分析 3.1.1经济可行性 由于本系统是作为毕业设计系统&#xff0c;且系统本身存在一些技术层面的缺陷&#xff0c;并不能直接用于商业用途&#xf…

用PHP来调用API给自己定制一个“每日新闻”

头条新闻汇聚了互联网上的时事动态&#xff0c;提供最新新闻动态、网络热门话题和视频更新等&#xff0c;覆盖社会、政治、体育、经济、娱乐、科技等多个领域&#xff0c;并不断刷新内容。企业应用这一接口后&#xff0c;可以快速吸引更多的用户访问自己的平台。即使是非新闻类…

直播预告丨华为数字化转型解决方案,助力钢铁行业飞越“寒冬”!

我国钢铁行业整体盈利处于近年来较低水平。2024年一季度&#xff0c;钢铁企业累计营业收入为1.49万亿元&#xff0c;同比下降4.55%&#xff1b;利润总额为87.08亿元&#xff0c;同比下降47.91%&#xff1b;平均利润率为0.58%&#xff0c;同比下降0.49%。 行业发展正面临着诸多…

【NOI-题解】1389 - 数据分析1750 - 有0的数1457 - 子数整除1121 - “倒”数1962. 数值计算

文章目录 一、前言二、问题问题&#xff1a;1389 - 数据分析问题&#xff1a;1750 - 有0的数问题&#xff1a;1457 - 子数整除问题&#xff1a;1121 - “倒”数问题&#xff1a;1962. 数值计算 三、感谢 一、前言 本章节主要对循环中带余除法部分题目进行讲解&#xff0c;包括…

【图解IO与Netty系列】Netty源码解析——服务端启动

Netty源码解析——服务端启动 Netty案例复习Netty原理复习Netty服务端启动源码解析bind(int)initAndRegister()channelFactory.newChannel()init(channel)config().group().register(channel)startThread()run()register0(ChannelPromise promise)doBind0(...) 今天我们一起来学…

数据价值管理-数据使用标准

前情提要&#xff1a;数据价值管理是指通过一系列管理策略和技术手段&#xff0c;帮助企业把庞大的、无序的、低价值的数据资源转变为高价值密度的数据资产的过程&#xff0c;即数据治理和价值变现。第一讲介绍了业务架构设计的基本逻辑和思路。 前面我们讲完了数据资产建设标准…

线性卷积(相关)和圆周卷积(相关)以及FFT之间的关系(AEC举例)

时域自适应滤波算法中的线性卷积和线性相关运算量较大&#xff0c;导致计算复杂度升高&#xff0c;我们更愿意把这两个信号变换到频域&#xff0c;通过频域相乘的方式来取代时域复杂度相当高的卷积或相关运算。 预备知识&#xff1a;线性卷积&#xff08;相关&#xff09;和圆…

Origin中增加一列并更新绘图

一、在book当中增加数据列 二、回到绘图中&#xff0c;双击图层 三、修改增加图像的格式 四、根据需要删除图例中多余的部分

Stable Diffusion 有什么推荐的Checkpoint 模型、Lora?

引言 -2k字给讲清楚我最常用的SD模型库、关键词和参数&#xff01; 2022年末我接触sd的时候&#xff0c;还在为可以用Ai绘画而沾沾自喜&#xff0c;现在玩的风生水起&#xff0c;真的感觉没有白接触。除了chatgpt的出现&#xff0c;Ai绘画无意识这两年来的黑科技&#xff0c;如…

接口postman

前后端 前端&#xff1a;是肉眼所能见到的界面 后端&#xff1a;处理数据&#xff0c;数据逻辑 接口&#xff1a;提供前后端交互的通道 接口测试&#xff1a;校验接口返回的响应数据是否与预期的一致 接口测试可以绕过前端&#xff0c;直接对服务器进行测试 请求方式 pos…