首页 > 其他分享 >Leetcode--位运算

Leetcode--位运算

时间:2024-10-13 08:49:52浏览次数:7  
标签:运算 -- 个数 偶数 int 异或 result Leetcode

  小伙伴们,大家好。今天给大家介绍一下位运算。

  首先给大家介绍一下常用的位运算符号:

  &(按位与)  |(按位或) ^(按位异或) <<(左移) >>(右移)

  以a=4,b=6为例:

  4的二进制为100,6的二进制为110(假设前名的0省略)

  a&b=100(每一位进行运算时如果均为1则该位为1否则为0)

  a|b=110(每一位进行运算时如果有一位为1则该位为1否则为0)

  a^b=010(相同为0不同为1)

  <<(左移一位原数扩大两倍)

  >>(右移一位原数缩小两倍)

  接下来给大家介绍一下比较简单的位运算情景:

(1)取模

  a%b,b=2^n(b是2的倍数注意这里不是异或符号)。那么a%b=a&(2^n-1)

(2)判断奇偶

  直接运用(1)的结论,如果a是偶数那么a&1=0,否则a&1=1

  (3)数字翻倍或减半

  使用<<和>>

(4)交换两数

  a=a^b

  b=a^b(b=(a^b)^b=a^(b^b)=a^0=a)

  a=a^b(a=(a^b)^a=(a^a)^b=0^b=b)

接下来是具体应用:

Leetcode--只出现一次的数字

  题目如下:

   我们在刚才的学习中已经知道:a^a=0。也就是说,如果我们对数组的所有元素进行按位异或运算,那么最终得到的结果一定是只出现一次的数字。

  例如,数组的元素为41212,result开始时为0,进行异或运0^4^1^2^1^2=4^(1^1)^(2^2)=4^0^0=4

注意result初始为0,这样第一次异或就会得到数组的第一个元素。

  给出代码:

int singleNumber(vector<int>& nums) {
        int result=0;
        for(int i=0;i<nums.size();i++){
            result=result^nums[i];
        }
        return result;
    }

Leetcode--比特位计数

  题目如下:

  首先告诉大家一个公式:X&(X-1)能够消去X的最低位1。例如:21=10101,21&20=10100=20,我们可以看见最低位1消失。 20&19=10100&10011=10000=16,最低位1消失。16&15=0,最低位1消失。大家可以很轻松的发现一个递推关系:f(n)=f(n&n-1)+1。

  据此我们给出代码:

vector<int> countBits(int n) {
        vector<int>nums(n+1);
        nums[0]=0;
        for(int i=1;i<=n;i++){
            nums[i]=nums[i&i-1]+1;
        }
        return nums;
    }

  除此之外,还有另一种方法,那就是根据奇数偶数来判断。一个奇数的1的个数比它的上一个偶数中1的个数多1个。比如6=110,7=111。比如9=1001,8=1000。一个偶数的1的个数与它的1/2中1的个数相同。例如,8=1000,它的一半4=100,4也是偶数它的一半为2=10,2也是偶数它的一半1=1,1为奇数它的1的个数比0多一个为1个。

  据此我们给出代码:

 vector<int> countBits(int n) {
        vector<int>nums(n+1);
        nums[0]=0;
        for(int i=1;i<=n;i++){
            if(i&1==1){//奇数
                nums[i]=nums[i-1]+1;
            }
            else{
                nums[i]=nums[i>>1];
            }
        }
        return nums;
    }

Leetcode--汉明距离

  题目描述如下:   

   分析这道题目:思路很容易,x^y最终结果中1的位置就是二者不同的位置。我们只需要计算出1的个数即可。哦?这不是上一道题的应用吗!!直接给出代码:

int hammingDistance(int x, int y) {
        int result=x^y,count=0;
        while(result){
            result=result&(result-1);
            count++;
        }
        return count;
    }

  今天的位运算应用就到这里,感谢大家支持!!多多点赞!

   

 

标签:运算,--,个数,偶数,int,异或,result,Leetcode
From: https://blog.csdn.net/weixin_74901355/article/details/142877837

相关文章

  • 利用Vue3的axios+Python的flask实现前后端交互功能
    1功能实现1.1功能在网页中输入两个数字后,点击计算按钮在线计算(注意不是在浏览器端)获得两数之和。1.2思路前端使用vue3的axios向服务器发送post请求,利用flask框架使python服务器返回计算后的数值,赋给前端的变量,最终在浏览器上显示。2前端部分:2.1html<div><inputv-mod......
  • 基于Android的家庭理财管理和实现---附源码57138
    摘 要随着经济的发展和人们生活水平的提高,家庭理财管理变得愈发重要。然而,许多家庭对于如何有效地管理个人财务以及制定预算计划感到困惑。因此,本研究旨在提供一种简单、易用且功能全面的家庭理财管理工具。本论文旨在设计和开发一款基于Android平台的家庭理财管理APP。......
  • [赛记] 多校A层冲刺NOIP2024模拟赛05
    这场数数好数(number)100pts找三个数的和,而且允许$\Theta(n^2)$,那么我们可以维护出两个数的和,然后每次顺序遍历找这个数减去前面的某个数在任意两个数的和中有没有出现过,这个也是$\Theta(n^2)$的;所以时间复杂度:$\Theta(n^2)$,如果带$\log$会过不去,要用桶维护;点击......
  • 【C语言基础】核心关键字详解与应用
    目录一、void1.1.作用1.2.代码示例二、基本数据类型(char、int、float、double等)2.1.char(字符类型)2.2.int(整型)2.3.float(单精度浮点型)2.4.double(双精度浮点型)2.5.代码示例三、控制流程语句(if、else、switch、case、default等)3.1.if和else语句3.2.switch......
  • 画个圆圈
    画个圆圈作词:陈国祥作曲:陈国祥演唱:杜芈芮编曲:孙明雨录音:吴小顺混音:胡焕原指导老师:罗子欣音乐总监:陈国祥总监制:杜金泉出品:深圳市爱视听音乐传媒有限公司发行:《精彩星之梦》栏目组[1]歌曲歌词播报编辑画个圆圈作词:陈国祥作曲:陈国祥演唱: 杜芈芮总想......
  • java异常捕获-cnblog
    java异常捕获1异常概述异常是一个程序执行期间发生的事件,他中断了正在执行的程序2异常的抛出和捕获做一个案例字符串转int异常packagenb;publicclassNaaa{publicstaticvoidmain(String[]args){Stringa="tttt";intage=Inte......
  • 有首儿歌,女生唱的,歌词好像是拍拍手啊点点头画一个圈圈多奇妙…拍手,拍手,让我们一起来拍
      有首儿歌,男生唱的,歌词好像是拍拍手啊点点头画一个圈圈多奇妙…拍手,拍手,让我们一起来拍拍手! 匿名用户    2016-11-1223:39    为您推荐:其他回答歌词“拍手拍手拍拍手”是出自儿歌《做早操》歌曲:《做早操》词曲:栾泽先演唱:少儿合唱团发行时间:2014年9......
  • 【C语言基础】全局变量与局部变量的深入解析
    目录一、全局变量1.1.定义与声明1.2.特性1.2.1.生命周期1.2.2.作用域1.2.3.跨文件访问1.2.4.限制访问范围1.3. 示例1.4.注意事项1.4.1.过度使用全局变量导致代码难以理解和维护1.4.2.限制全局变量的使用范围1.4.3.清晰的命名和文档1.4.4.考虑替代方案......
  • 我想为你生个小孩,是什么歌 《老婆最大》--红蔷薇 2012
    我想为你生个小孩,是什么歌 匿名用户    2012-02-1411:55    推荐回答《老婆最大》--红蔷薇歌词我想要为你画个小圈儿把我们俩都围在中间儿咱俩的感情像条鞋带儿把你和我俩人绑在一块儿我想要为你织个坎肩儿陪着你度过那最冷的天儿我想要和你摆个小摊儿......
  • 【SOP】迭代管理-如何更好的避免问题发生
    人们往往不知道做事情的原因,所以不知道该如何做,下边先告诉大家,为什么要流程标准化?会给我们带来的好处,也就是所谓的SOP的优点(标准操作程序)。工作中曾遇到的问题,有些可能会导致故障或影响需求交付标题需求层面发生的问题:需求生效范围不清晰,导致故障平台升级时,通知不到位,......