两数交换,数组查找奇数个数的数(位运算)

news2024/11/18 16:33:23

文章目录

  • 一、异或运算:
    • 1.1 Demo
    • 1.2 面试题

一、异或运算:

1.1 Demo

0和N进行异或运算都等于N

任何一个数和自己异或运算都等于0

且异或运算满足交换率 a^b = b^a

eg: a = 甲 , b = 已 那么则有 a = a^b

​ b = a^b

​ a = a^b

故有: 进行第一个式子之后 则有 a = 甲 ^ 已; b = 已

  												a = 甲 ^已; b = 甲 ^ 已 ^ 已  = 甲 ^ 0;  则b = 甲 因为任意两个相同的数 进行与运算都等于0

​ 此时在进行第二个式子的运算则有:

​ a = 甲 ^ 已 ^ 甲; a = 已;

​ 再进过第三个式子 则有 a = 已; 因为此时 a = 已 ^ 甲 ^ 甲; a = 已;

注意 以上操作的前提是 a和b 在内存中是两个独立的区域

package com.xc.dataStruct.异或运算;

/**
 * @project untitled
 * @description
 * @author capture or new
 * @date 2024/5/24 15:13:58
 * @version 1.0
 */
public class Demo {
    /**
     *  0和N进行异或运算都等于N
     *  任何一个数和自己异或运算都等于0
     *  且异或运算满足交换率 a^b = b^a
     *  eg: a = 甲 , b = 已  那么则有 a = a^b
     *                              b = a^b
     *                              a = a^b
     *                          故有: 进行第一个式子之后 则有 a = 甲 ^ 已; b = 已
     *                                                   a = 甲 ^已; b = 甲 ^ 已 ^ 已  = 甲 ^ 0;  则b = 甲 因为任意两个相同的数 进行与运算都等于0
     *                                                   此时在进行第二个式子的运算则有:
     *                                                      a = 甲 ^ 已 ^ 甲; a = 已;
     *                                                   再进过第三个式子 则有 a = 已; 因为此时 a = 已 ^ 甲 ^ 甲; a = 已;
     *
     *        注意 以上操作的前提是 a和b 在内存中是两个独立的区域
     **/
    public static void main(String[] args) {
//        接下来演示两个数的交换测试
        int a = 10;
        int b = 40;
        getSwap(a, b);
    }

    private static void getSwap(int a, int b) {
       a = a^b;
       b = a^b;
       a = a^b;
        System.out.println(a);
        System.out.println(b);
    }
}

1.2 面试题

package com.xc.dataStruct.异或运算;

/**
 * @project untitled
 * @description
 * @author capture or new
 * @date 2024/5/24 15:33:26
 * @version 1.0
 */
public class 面试题 {
    /**
     * O(n)时间和 O(1)空间
     * 在一个数组中 一种数出现了奇数次 其他数出现了偶数次 求这个数
     * 第二问: 两种数出现了奇数次,其他数都出现了偶数次。求这两个数
     **/
    public static void main(String[] args) {
        one();
        two();
    }

    // 第一问  前面说到位运算满足结合律 我们这里 虽然是有很多数,但是奇数个只有一种。我们可以看做将有偶数个个数的数进行先放到一堆进行异或运算后再最后对那个只有奇数个数的数进行异或运算,到最后肯定就只剩下了0^那个数  eg: 3^3^3 = 0^3 = 3
    public static void one(){
        int arr[] = {2,3,2,1,5,1,5};
        int eor = 0;
        for (int i = 0; i < arr.length; i++) {
            eor ^= arr[i];
        }
        System.out.println(eor);
    }
    // 第二问
    /**
     * 第一步:首先我们使用eor 从到到尾进行异或运算,因为有两种奇数个个数的数,所以异或到最后肯定只剩下了eor = a^b,且肯定不等于零,a不等于b
     * 第二步:对于位运算来说 一个整数有32位,我们进行上面的第一轮异或运算后只剩下了a^b,之后我们要获取到这两个数,两个数不相等在位运算中,则定然有这两个中存在某一位不等,一个整数的那个位为0另一个整数的那个数为1.
     * 第三步:这样我们可以根据位再次将数数组分为两组,一组是那个位为0 的数,一组则是那个位为1的数。之后我们再次创建一个eor` 进行再次与运算这样我们就获取到了a或者是b。
     * 第四步:这样 eor = a^b, eor` = a。 这样我们又回到了原始状态了的异或运算了。两个数异或运算这样就得到了b。 实现了对两种数的计算了。
     **/
    public static void two(){
        int arr[] = {2,3,2,1,5,1,5,9};
        // 先使用eor 进行从头到尾进行一次异或运算
        int eor = 0;
        for (int i = 0; i < arr.length; i++) {
            eor ^= arr[i];
        }

        // 取出一个不为零的数的最右侧的1  。也就是两组数中不同的哪一位,这里假设为最右侧的哪一位。
        int rightOne = eor & (~eor + 1);

        int onlyOne = 0; //eor`
        for (int i = 0; i < arr.length; i++) {
            if ((arr[i] & rightOne) == 0){ // 进行与运算,这里我们就是要计算出a 或者是b,只有相同的哪一位才是我们想要的哦。
                onlyOne ^= arr[i];
            }
        }

        System.out.println(onlyOne + " " +(onlyOne ^ eor));
    }
}

(位运算)提取出一个不等于零的数的最右侧的1

在这里插入图片描述

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

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

相关文章

MySQL进阶 日志结尾以及8.0新特性

日志结尾 前面我们聊了mysql的undo日志,redo日志,binlog等等,也从一条update语句来分析了一下日志的执行思路以及版本控制是怎么回事,四大特性是怎么实现的等等 今天我们来说说最后一个错误日志 其实用处不大 因为对我们开发人员来说基本上是没有权限来查看错误日志的 一般…

爬虫工程师---如何用charles把scrapy的爬虫监控起来调试

前言: 想法是,通过charles挂上魔法工具,然后跑代码的时候,实时监控每一个访问的请求状态和返回是个啥? 原理其实和挂手机等一样的;但是,我想说的,让scrapy挂上charles... 之前写过关于fiddler挂代理的路子,还有关于fiddler和charles的证书的文章,不明白的可以去查看 手机模拟器…

Unity Miscellaneous入门

概述 在Unity中有非常多好用的组件&#xff0c;也是Unity为我们提供的方便的开发工具&#xff0c;它的功能可能不是主流的内容&#xff0c;比如渲染&#xff0c;音乐&#xff0c;视频等等&#xff0c;所有Unity把这些内容统一归到了一个杂项文件组中。 Unity组件入门篇总目录-…

Centos 7 上安装【Docker】

安装Docker&#xff08;Centos 7&#xff09; 1.1.卸载&#xff08;可选&#xff09; 如果之前安装过旧版本的Docker&#xff0c;可以使用下面命令卸载&#xff1a; ***注意&#xff1a;***若提示[您需要 root 权限 执行此命令]需要在命令前加上sudo yum remove docker \do…

2. C++服务器编程-信号

什么是信号 其实信号就是一个中断。就是在执行程序的时候突然来了一个信号&#xff0c;然后我们去执行这个新来的程序了&#xff0c;这就是中断。 处理方法 信号的处理方式∶忽略、捕获、默认处理 linux中都有那些信号 man7 signal 比如说kill -9 安装man中文手册 自己百…

数据挖掘实战-基于内容协同过滤算法的电影推荐系统

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

[JAVASE] 类和对象(五) -- 抽象类和接口

目录 一. 抽象类 1.1 抽象类的定义 1.2 抽象类的实现 1.3 抽象类的作用 1.4 抽象类注意事项 二. 接口 2.1 接口的定义 2.2 接口的实现 2.3 接口的作用 2.4 接口注意事项 三. 总结 一. 抽象类 1.1 抽象类的定义 如果一个类中没有包含足够的信息来描绘一个具体的对象, 那么…

Apache无法确定服务器的完全合格域名(FQDN)报错解决方法

文章目录 一、apache语法检查报错二、报错原因分析三、报错解决办法 一、apache语法检查报错 当我们在进行apache配置时&#xff0c;需要检查配置是否存在语法错误&#xff1a; sudo apache2ctl configtestAH00558: apache2: Could not reliably determine the servers fully…

图解CPU、内存、硬盘的工作原理

1、简要概括 硬件作用cpu 负责执行计算机程序的指令内存用于临时存储程序和数据。硬盘将数据从硬盘读取到内存或将数据从内存写入硬盘的过程。联系三者协同工作&#xff0c;CPU执行程序指令&#xff0c;将需要的数据从硬盘读取到内存&#xff0c;进行计算后再将结果写回内存或…

JDBC访问数据库

JDBC学习笔记代码jar包等连接 链接&#xff1a;https://pan.baidu.com/s/1NqgMucUk7JjoSZXEkA-PPQ?pwd60kv 提取码&#xff1a;60kv –来自百度网盘超级会员V3的分享 下载驱动 不管是连接mysql还是sqlserver都需要Java的一个驱动包&#xff0c;及XXX.jar包&#xff0c;这个包…

扩散模型学习1

DDPM 总体训练原理 https://www.bilibili.com/video/BV1nB4y1h7CN/?spm_id_from333.337.search-card.all.click&vd_sourcef745c116402814185ab0e8636c993d8f 讲得很好&#xff1a;每次都是输入t和noise-x的图像&#xff0c;预测noise之后得到和加入的noise比较&#xff1b…

如何搭建springBoot项目中的全局异常处理和自定义异常处理

目录 1 什么是异常 2 异常的种类 3 解决异常的方式 4 全局异常处理器和自定义异常处理器 5 测试异常处理 1 什么是异常 异常&#xff08;Exception&#xff09;是在程序执行过程中出现的一种特殊情况或错误。它可以是由于程序逻辑错误、运行环境问题、用户输入错误等原因…

Unity中计数器的实现

Unity中计数器的实现 一、前言二、效果与逻辑&#xff08;一&#xff09; 实现效果&#xff08;二&#xff09;功能逻辑 三、功能代码四、应用实现五、结语 一、前言 最近在开发中用到计数器&#xff0c;但是unity自带的UI组件中没有&#xff0c;所以只好自己手撸了一个&#x…

亚马逊云科技介绍

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、亚马逊云科技云计算1.1 云计算的优势 二、领先的云平台三、亚马逊云科技区域的全球网络…

1Panel应用推荐:code-server

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

Redis常见数据类型(3)-String, Hash

目录 String 命令小结 内部编码 典型的使用场景 缓存功能 计数功能 共享会话 手机验证码 Hash 哈希 命令 hset hget hexists hdel hkeys hvals hgetall hmget hlen hsetnx hincrby hincrbyfloat String 上一篇中介绍了了String里的基本命令, 接下来总结一…

XV4001系列陀螺仪传感器广泛用于车载导航系统

随着汽车电子化趋势的加速&#xff0c;越来越多的汽车配备一系列先进的车载导航系统&#xff0c;这些导航系统功能的实现都依赖于精确的传感器数据(位置、车速、转向角度、车轮转速等)。传感器作为这些系统的核心组件&#xff0c;其准确性和可靠性直接影响到整个导航系统的性能…

OSPF问题

.ospf 选路 域内 --- 1类&#xff0c;2类LSA 域间 --- 3类LSA 域外 --- 5类&#xff0c;7类LSA --- 根据开销值的计算规则不同&#xff0c;还分为类型1和类型2 ospf 防环机制 区域内防环&#xff1a;在同一OSPF区域内&#xff0c;所有路由器通过交换链路状态通告&#xff…

鸿蒙原生应用元服务开发-鸿蒙真机运行项目实战与注意事项

一、解压项目注意项目包不能为中文 二、用数据线将装好DevEco Studio的电脑与设置为开发者模式的鸿蒙手机相连接。 三、将项目包托进DevEco Studio 中 注意项目包文件不能有嵌套 四、查看设备运行 五、点击项目结构 六、勾选红色框圈部分 登录开发者账号 七、选择好公司 八、等…

2024年人文艺术与创新教育国际学术会议(ICHAIE 2024)

2024年人文艺术与创新教育国际学术会议&#xff08;ICHAIE 2024) 2024 International Conference on Humanities, Arts and Innovation Education 一、【会议简介】 随着全球化的推进和科技的迅猛发展&#xff0c;人文艺术与创新教育在培养未来人才方面扮演着越来越重要的角色…