博客
关于我
左神算法班笔记——异或
阅读量:279 次
发布时间:2019-03-01

本文共 1065 字,大约阅读时间需要 3 分钟。

异或应用于数组奇数次数字问题

异或运算在计算机科学中具有独特的性质,常用于解决一些巧妙的算法问题。本文将探讨如何利用异或运算来解决数组中数字出现次数奇偶性的问题。

问题一:找出出现奇数次的数字

问题描述:在一个数组中,恰好有一个数字出现了奇数次,其余数字都出现了偶数次。要求找出这个出现奇数次的数字。

解题思路

  • 异或运算的性质:相同的数字异或偶数次结果为0,奇数次结果为数字本身。
  • 因此,将所有数组中的数字依次异或,结果即为出现奇数次的数字。

代码实现

public static void printOddTimeNum1(int[] arr) {    int eor = 0;    for (int cur : arr) {        eor ^= cur;    }    System.out.println(eor);}

问题二:找出出现奇数次的两个数字

问题描述:在一个数组中,恰好有两个数字各出现了奇数次,其余数字都出现了偶数次。要求找出这两个数字。

解题思路

  • 计算所有数字的异或结果(记为eor),由于两个数字出现奇数次,eor将等于这两个数字的异或结果。
  • 找到eor的最低设置位(LSB),将数组中的数字按照该位是否为1分为两组。
  • 分别计算每组的异或结果,分别得到两个数字。
  • 代码实现

    public static void printOddTimeNum2(int[] arr) {    int eor = 0;    for (int cur : arr) {        eor ^= cur;    }    int rightOne = eor & (~eor + 1);    int onlyOne = 0;    for (int cur : arr) {        if ((cur & rightOne) == 0) {            onlyOne ^= cur;        }    }    System.out.println("两个奇数次数字:" + onlyOne + " 和 " + (onlyOne ^ eor));}

    代码解析

    • 计算异或结果(eor:将所有数字异或,得到异或结果。
    • 确定最低设置位(rightOne:通过 ~eor + 1 操作,找到eor的最低设置位。
    • 分组异或:根据rightOne位是否为1,将数组分为两组,分别计算异或结果,得到两个数字。

    通过以上方法,我们可以高效地解决这些问题,利用异或的性质简化了计算过程。

    转载地址:http://icsa.baihongyu.com/

    你可能感兴趣的文章
    Open××× for Linux搭建之二
    查看>>
    Open×××有线网络时使用正常,无线网络时使用报错的解决方案
    查看>>
    Operation not supported on read-only collection 的解决方法 - [Windows Phone开发技巧系列1]
    查看>>
    Operations Manager 2007 R2系列之仪表板(多)视图
    查看>>
    operator new 与 operator delete
    查看>>
    operator() error
    查看>>
    OPPO K3在哪里打开USB调试模式的完美方法
    查看>>
    Optional类:避免NullPointerException
    查看>>
    ORA-00932: inconsistent datatypes: expected - got NCLOB【ORA-00932: 数据类型不一致: 应为 -, 但却获得 NCLOB 】【解决办法】
    查看>>
    ORA-00942 表或视图不存在
    查看>>
    ORA-01795: 列表中的最大表达式数为 1000
    查看>>
    ORA-06575: 程序包或函数 NO_VM_DROP_PROC 处于无效状态
    查看>>
    ora-12541:tns:no listener
    查看>>
    【docker知识】联合文件系统(unionFS)原理
    查看>>
    ORACEL学习--理解over()函数
    查看>>
    oracle 10g crs命令,Oracle 10g CRS安装问题解决一例
    查看>>
    oracle 10g的安装配置
    查看>>
    Oracle 11.2.0.4 x64 RAC修改public/private/vip/scan地址
    查看>>
    Oracle 11G INDEX FULL SCAN 和 INDEX FAST FULL SCAN 对比分析
    查看>>
    Oracle 11g 使用RMAN备份数据库
    查看>>