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

文章目录

  • 一、异或运算:
    • 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

在这里插入图片描述

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

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

相关文章

全面提升工业物联网的安全问题——青创智通

工业物联网解决方案-工业IOT-青创智通 工业物联网&#xff0c;作为现代工业制造领域的新兴技术&#xff0c;正在引领一场全新的工业革命。它将传感器、控制器、移动通信、智能分析等先进技术融入到工业生产过程的各个环节&#xff0c;极大地提高了制造效率&#xff0c;改善了产…

通过修改物理内存实现跨进程内存读写

习一下利用修改物理内存来跨进程内存读写 系统&#xff1a;win10 21h1 x64 编译环境: vs2022 详情见附录 基础 虚拟地址转物理地址 虚拟地址也称线性地址&#xff0c;一个线性地址进程的DirBase地址可以转换成物理地址。先来看线性地址的含义 在x64体系中只实现了48位的virtu…

力扣算法之627. 变更性别

仅作为个人解题思路记录 题解: 1.要求将m换成f&#xff0c;f换成m 2.要求使用一句update语句 我的解 UPDATE Salary SET sex (CASE WHEN Salary.sexm THEN f WHEN Salary.sexf THEN m end) 我的解注解 sql server中update中允许使用case以及iif

代码随想录算法训练营第十七天(py)| 二叉树 | 110.平衡二叉树、 257. 二叉树的所有路径、404.左叶子之和

110.平衡二叉树 力扣链接 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树&#xff08;所有节点的左右子树深度不会超过1&#xff09; 思路 后序遍历 如果判断到子树不是平衡二叉树&#xff0c;就返回-1&#xff0c;这个-1会一路向上返回到根节点 class Solution:def i…

【机器学习-08】 | Scikit-Learn工具包进阶指南:Scikit-Learn工具包之决策树算法实战分析

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

(3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)

目录 一、磁共振快速采集技术基础 1.K空间的基本特点 2.快速成像的理由&#xff1a; 3.快速成像的硬件要求&#xff1a; 二、磁共振快速采集技术 1.采集更少的相位编码线 2.平行采集技术PAT 3.其他与快速采集有关的技术 1&#xff09;部分回波技术 2&#xff09;频率…

四川音盛佳云电子商务有限公司正规吗?靠谱吗?

在数字化浪潮席卷全球的今天&#xff0c;电子商务已成为推动经济发展的重要引擎。四川音盛佳云电子商务有限公司&#xff0c;作为抖音电商服务的佼佼者&#xff0c;正以其独特的视角和创新的策略&#xff0c;引领着抖音电商的新潮流&#xff0c;开启着电商服务的新篇章。 四川…

单例模式中的 双判断锁 问题、单例模式的资源问题

》》》Lazy 不存在高并发问题&#xff0c;lazy已经解决了。 CLR 类执行的顺序 静态变量初始化 1次静态构造函数 1次实例变量初始化基类静态变量初始化 1次基类静态构造函数 1次基类实例变量初始化基类实例构造函数实例构造函数 》》》 创建单例模式 好多种 1&#xff0c;静态…

Linux x86_64 UEFI 启动

文章目录 前言一、UEFI二、Disk device compatibility2.1 GPT 磁盘分区表2.1.1 简介2.1.2 Linux 2.2 ESP&#xff08;EFI&#xff09; 文件系统2.2.1 简介2.2.2 LinuxLinux Kernel EFI Boot Stub 三、UEFI GPT grub23.1 简介3.2 引导方式 3.3 BOOTX64.EFI3.4 shimx64.efi3.5 …

4.双指针+递归

一、双指针编程技巧 方法参数传递数组 将数组通过方法参数传递&#xff0c;方法操作的数组和main方法中的数组指向同一块内存区域&#xff0c;意味着方法操作数组&#xff0c;同时会引起main方法中数组的改变以引用的方式作为方法参数进行传递的 元素交换 定义临时变量temp&a…

代码随想录算法训练营第16天 |● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数

文章目录 前言104.二叉树的最大深度思路知识点 方法一 递归法方法二 迭代法 559. n叉树的最大深度111.二叉树的最小深度思路方法一 后向遍历递归法方法二 迭代法 222.完全二叉树的节点个数思路方法一 当成普通二叉树来做方法二 利用完全二叉树的特性 总结 前言 所有的题目一刷…

带你玩转OpenHarmony AI:打造智能语音子系统

简介 AI时代&#xff0c;智者当先&#xff0c;判断一个终端设备是否智能&#xff0c;语音能力是必不可缺的。智能家居、智慧厨房、智能汽车等等&#xff0c;一切衣食住行都在往智能方向发展&#xff0c;那我们该如何在OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&am…

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

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

c++读取文本文件出现乱码问题

else if (type 2) { //教师身份验证 int fId; //从文件中获取的id号 string fName; //从文件中获取的姓名 string fPwd; //从文件中获取的密码 while (ifs >> fId && ifs >> fName && ifs >> fPwd) { cout…

windows Oracle 11g服务器端和客户端安装 SQLark连接ORACLE

1 从ORACLE官网下载数据库安装包 https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 2:安装数据库 注意&#xff1a;在加载组件的这一步&#xff0c;如果你的电脑里面有杀毒软件&#xff0c;首先把安装目录加入白名单&#xff0c;要不然可能会一直加载组件失败。…

面向对象的理解

1.结构化程序设计(面向过程) 结构化程序主张按功能来分析系统需求&#xff0c;结构化的主要原则&#xff1a; 自顶向下 逐步求精 模块化设计 结构化程序会按功能把程序分为一个个的单独的文件&#xff0c;例如&#xff1a;让灯亮这个功能&#xff0c;就会由多个函数构成一…

银行总部文件自动下发,如何保证不影响专线网络使用?

银行在我国金融体系中占据重要地位&#xff0c;是我国市场经济的重要组成部分。我国商业银行随着自身不断发展&#xff0c;规模日益扩大&#xff0c;形成了“总行-分行-支行-营业网点”的典型层级管理模式。在日常中&#xff0c;银行总部存在文件下发的场景&#xff1a; 银行总…

c4d云渲染是工程文件会暴露吗?

在数字创意产业飞速发展的今天&#xff0c;C4D云渲染因其高效便捷而备受欢迎。然而&#xff0c;随着技术应用的深入&#xff0c;人们开始关注一个核心问题&#xff1a;在享受云渲染带来的便利的同时&#xff0c;C4D工程文件安全吗&#xff1f;是否会有暴露的风险&#xff1f;下…

常见的字符编码

字符&#xff1a;各种文字和符号的总称&#xff0c;包括各个国家的文字&#xff0c;标点符号&#xff0c;图形符号&#xff0c;数字等 字符集&#xff1a;字符集是多个符号的集合&#xff0c;每个字符集包含的字符个数不同 字符编码&#xff1a;字符集只是规定了有哪些字符&a…

openlayers绘制经纬网格,有添加或者移除功能

项目需要在地图中添加经纬网格&#xff0c;然后看了一下官网有相关的介绍 官网 我的项目是vue写的&#xff0c;当点击多选框显示隐藏经纬网格&#xff0c;下面直接写代码 这是绘制经纬网格方法 //引入 import TileArcGISRest from ol/source/TileArcGISRest import "ol/o…