“只出现一次的数字”系列 剑指offer--位运算学习(一)

2023-11-16

最近学了下位运算,简单说说收获吧。

首先我们要了解下常见的位运算操作:

  • 与或非操作
    在这里插入图片描述
  • 异或操作
    在这里插入图片描述

进阶规律:与或非 和 异或都是满足结合律的。
在这里插入图片描述
在这里插入图片描述

//重点
a&b&c=ab(b|c)

a^a=0

a^(~a)=1

0^b=b

我们先来看看第一道题:

在这里插入图片描述

做这道题需要一个重要的知识点:

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

也就是说一堆数一起异或,最后剩下的应该是非偶数重复数的异或和。

上面的问题重复的数都是偶数,就一个不重复的数。我们将它异或,结果就是我们要的数。

代码如下:

class Solution {
    public int singleNumber(int[] nums) {
     int ans =0;
     //求所有数的异或和
    for(int i=0;i<nums.length;i++){
        ans ^=nums[i];
    }
    return ans;
    }
}

第二道题 :数组不重复的数字有两个,我们把它挑出来。

在这里插入图片描述
这道题就比上个题难了一些。
需要用到两个套路。
我们拿 [2,2,3,5]举例子:
我们将数组里的数字异或操作,观察下这个异或值的二进制形式。

0000 0000 0000 0011
0000 0000 0000 0101
-------------------    异或之后
0000 0000 0000 0110

我们发现3 和 4的第二位第三位的值不一样,而且这个位置异或后肯定为1,如果我们以这两位之一为分辨标准,用一个1 进行与操作,就可以将两个数分到不同的组里。再对每组分别求值,就可以得到最终结果。

class Solution {
    public int[] singleNumber(int[] nums) {
    // 第一个不重复的数字
    int a=0;
    //第二个不重复的数字
    int b=0;
    //所有数的异或值
    int xor=0;

    //求出所有数的异或值
    for(int i=0;i<nums.length;i++) xor^=nums[i];

    //定义探针,并且确定两数不同的二进制位
    int div=1;
    while((xor & div)==0) div=div << 1;
    
    //用探针将数分为两组,分别求我们要的两个数 a b
    for(int i=0;i<nums.length;i++){
        if((nums[i] & div)==0) a^=nums[i];
        else b^=nums[i];
    }
    return new int[]{a,b};
     }
}

另外一种解法:

    public static void printOddTimesNums(int[] arr) {
        int eor = 0;

        //让ero = a ^ b

        for(int num : arr){
            eor = eor ^ num;
        }

        //找出从右数第一个为1的位数,也是a和b有差异的位数

        int right = eor & (~eor + 1);

        //将a或者b挑出来

        int eors = 0;
        for (int i = 0; i < arr.length; i++) {
            if ((arr[i] ^ right) != 0) {
                eors = eors ^ arr[i];
            }
        }
        
        //此时 eor = a ^ b eors = a || b 他俩异或求出另外一个 
        
        eor = eors ^ eor;
        // 然后输出eor和eors即可
    }

记住这个:

     //只保留eor从右往左数第一个1的方法

        int right = eor & (~eor + 1);

只出现一次的数字Ⅱ

在这里插入图片描述

class Solution {
    public int singleNumber(int[] nums) {
   int a = 0, b = 0;
    for (int x : nums) {
        b = (b ^ x) & ~a;
        a = (a ^ x) & ~b;
    }
    return b;
    }
}

这题就当记规律了。

        b = (b ^ x) & ~a;
        a = (a ^ x) & ~b;

可以做到三数消除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“只出现一次的数字”系列 剑指offer--位运算学习(一) 的相关文章

随机推荐

  • undefined 和 undeclared 的区别

    var a undefined b b is not defined 区别 在变量作用域中已经申明但没有赋值的变量 如 a 是undefined 相反 在变量作用域中没有申明过的变量 是undeclared 我们试图访问 undeclare
  • ahook中常用的一些hooks

    官方文档 https ahooks js org zh CN 以下总结一些个人认为非常实用的hook 1 useRequest 请求 import useRequest from ahooks const getSome async gt
  • VUE中使用防抖和节流

    目的 减少请求次数 节省资源 防抖 在事件触发n秒后执行函数 如果在n秒内再次出发 就重新计算 节流 在多次执行某一动作时 限制为每隔一段时间执行一次函数 防抖 连续的事件 只需触发一次 eg 高频率的点击 防止表单重复提交 输入框搜索 输
  • jdk8以上jvm常用参数

    这几天一直在折腾jvm调优的事情 作为新手 把自己遇到的问题记录下来 调整jvm参数的方法有很多 网上也到处是 我也看了很多 选择用tomcat进行jvm参数设置 linux服务器配置 linux系统下的tomcat通过startup sh
  • MySQL优化之索引原理(二)

    一 前言 上一篇内容说到了MySQL存储引擎的相关内容 及数据类型的选择优化 下面再来说说索引的内容 包括对B Tree和B Tree两者的区别 1 1 什么是索引 索引是存储引擎用于快速找到记录的一种数据结构 对性能的提升有很大的帮助 尤
  • 让我来教你如何免费使用RHEL小红帽系统

    RHEL安装注册过程中遇到的问题 从开始注册到正常使用 如何获取正版RHEL 注意事项 VMware虚拟机下载安装 安装中出现的问题 从开始注册到正常使用 答主是个动手能力比较强的人 所以当老师讲到Linux的时候 我就已经掌握了Linux
  • 计算机表格怎么取消分页,Excel表格自动分页、取消分页等技巧 专家详解

    Excel是一款功能强大的软件 利用Excel制作表格时 有时我们需要对表格进行分页打印 那么Excel表格如何自动分页 取消分页呢 下面小编为你带来解答 工具 材料 Excel2010 操作方法 01 打开Excel2010 进入要编辑的
  • 程序包com.sun.xml.internal.messaging.saaj.packaging.mime.util不存在

    添加maven compiler plugin插件即可
  • 区块链技术的应用与发展

    区块链的概念 区块链技术起源于2008年由化名 中本聪 的学者在密码学邮件组发表的奠基性论文 比特币 一种点对点电子现金系统 目前尚没有行业内公认的区块链定义 狭义来讲 区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一 种链式数
  • 怎么解决Ubuntu下Hadoop的报错:hadoop:command not found?

    在执行hadoop下的子项目 文字计数功能时出现hadoop command not found 的报错 通过百度以及问老师同学才知道报错的原因是Hadoop的环境变量配置出了问题 解决方案如下 输入命令 sudo vi etc profi
  • 滑动窗口+前缀和-8--LC930.和相同的二元子数组

    class Solution object def numSubarraysWithSum self nums goal type nums List int type goal int rtype int 1 前缀和 presum 0 a
  • RxDownload-基于RxJava打造的下载工具, 支持多线程和断点续传

    http www jcodecraeer com a anzhuokaifa androidkaifa 2016 1104 6743 html 大文件下载测试中 内存占用一直趋于平稳 主要功能 使用Retrofit OKHTTP来进行网络请
  • qt中事件分发器event和事件过滤器eventFilter使用

    在qt中窗口部件接收到主程序的消息映射后 会进入到事件分发器模块 就是event虚函数接口 我们可以在该接口里进行特定事件的自定义处理 而当窗口部件需要过滤某一事件时 可以使用事件过滤器模块 就是eventFilter虚函数接口 它是在进入
  • 阿里云服务上Elasticsearch的安装及简单使用(一)

    Elasticsearch是一个高度可伸缩的开源全文搜索和分析引擎 它允许你以近实时的方式快速存储 搜索和分析大量的数据 它通常被用作基础的技术来赋予应用程序复杂的搜索特性和需求 关于Elasticsearch的一些几本概念 在此不做过多的
  • arduino+ESP32 web配网演示代码

    include
  • 如何查看自己的公网ip

    windos查看公网ip地址 1 直接访问 百度 2 就是win r输入cmd然后输入 tracert www baidu com 3 其他查询地址 https ip cn https ip138 com https ifconfig me
  • 生成对抗网络GANs理解(附代码)

    生成对抗网络GANs理解 附代码 原文地址 http blog csdn net sxf1061926959 article details 54630462 生成模型和判别模型 理解对抗网络 首先要了解生成模型和判别模型 判别模型比较好理
  • jax安装Ubuntu,cudnn版本查看

    Ubuntu18 04 有GPU jax安装后显示错误如图所示 无法识别GPU 使用升级后并不能解决 Cuda gt 11 8 and cudnn gt 8 6 采用如下方法重新安装 pip install jax cuda11 cudnn
  • 【详解】静态Web服务器搭建代码实现_Python

    目录 1 浏览器网络请求流程 2 搭建python自带静态web服务器 2 1 静态web服务器开发流程 2 2 返回指定页面 2 3 多任务版服务器 2 4 面向对象服务端 3 动态端口 1 浏览器网络请求流程 浏览器首先链接DNS服务器
  • “只出现一次的数字”系列 剑指offer--位运算学习(一)

    最近学了下位运算 简单说说收获吧 首先我们要了解下常见的位运算操作 与或非操作 异或操作 进阶规律 与或非 和 异或都是满足结合律的 重点 a b c ab b c a a 0 a a 1 0 b b 我们先来看看第一道题 做这道题需要一个