当前位置: 首页 > article >正文

数据结构与算法2-俩变量值交换、理解异或位运算

文章目录

  • 1. 变量值交换方法1
  • 2. 变量值交换方法2
  • 3. 理解异或位运算,相当于无进位相加
  • 4. 数组中只有一种数出现了奇数次,找出这种数
  • 5. 数组中只有两种数出现了奇数次,找出这两种数

1. 变量值交换方法1

    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

2. 变量值交换方法2

    public static void swap(int[] arr, int i, int j) {
        // 这里的i 和 j 不能相等,否则就用到了同一内存,就会变为0;
        // arr[i] 和 arr[j]的值可以相等,它们的值是存在不同栈中,并不是同一块内存
        if (i == j) {
            return;
        }
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

步骤分析:

int a = 甲;
int b = 乙;
a = a ^ b; // a = 甲 ^ 乙;
b = a ^ b; // b = 甲 ^ 乙 ^ 乙 = 甲 ^ (乙 ^ 乙) = 甲 ^ 0 = 甲
a = a ^ b; // a = 甲 ^ 乙 ^ 甲 = 甲 ^ 甲 ^ 乙 = 0 ^ 乙 = 乙

3. 理解异或位运算,相当于无进位相加

异或位运算原理:相同为0, 不同为1

  • 0 1 -> 1
  • 1 0 -> 1
  • 0 0 -> 0
  • 1 1 -> 0

满足的性质:

  • 0 ^ N = N
  • N ^ N = 0;
  • 满足交换律:a ^ b = b ^ a;
  • 满足结合率:a ^ b ^ c = a ^ (b ^ c);

4. 数组中只有一种数出现了奇数次,找出这种数

	public static void main(String[] args) {
        int[] arr = {2, 2, 3, 3, 7};
        printOddTimesNum1(arr);
    }


    /*
     * 数组中只有一种数出现了奇数次,找出这种数
     *
     * */
    public static void printOddTimesNum1(int[] arr) {
        int eor = 0;
        for (int cur : arr) {
            eor ^= cur;
        }
        System.out.println(eor);
    }

打印结果:

7

5. 数组中只有两种数出现了奇数次,找出这两种数

	public static void main(String[] args) {
        int[] arr2 = {2, 2, 3, 3, 7, 8};
        printOddTimesNum2(arr2);
    }

    /*
     * 数组中只有两种数出现了奇数次,找出这两种数
     *
     * */
    public static void printOddTimesNum2(int[] arr) {
        int eor = 0, onlyOne = 0;
        for (int curNum : arr) {
            eor ^= curNum;
        }
        // eor = a ^ b;
        // eor != 0;
        // eor必然有一个位置上是1
        int rightOne = eor & (~eor + 1); // 提取出最右的1
        for (int cur : arr) {
            if ((cur & rightOne) == 0) {
                onlyOne ^= cur;
            }
        }
        System.out.println(onlyOne + "\n" + (eor ^ onlyOne));
    }

打印结果:

8
7


http://www.kler.cn/a/274479.html

相关文章:

  • 《薄世宁医学通识50讲》以医学通识为主题,涵盖了医学的多个方面,包括医学哲学、疾病认知、治疗过程、医患关系、公共卫生等
  • ONES 功能上新|ONES Copilot、ONES Wiki 新功能一览
  • Spring MVC 中,处理异常的 6种方式
  • WebGL入门到进阶教程 - 系统学习Web3D技术
  • uniapp 将base64字符串保存为图片、Word、Excel、音频、视频等文件
  • POD 存储、PV、PVC
  • 大数据技术学习笔记(十三)—— HBase
  • CentOS 7.9 常用环境配置
  • YOLOv5源码逐行超详细注释与解读(1)——项目目录结构解析
  • 经典控制算法——PID算法原理分析及优化
  • 条件随机场(CRF)笔记
  • 源码部署LAMP架构
  • 【JavaScript知识点】预解析、作用域、数据类型、数组常用方法、字符串常用方法
  • 【Leetcode-189.轮转数组】
  • spring suite搭建springboot操作
  • [Java、Android面试]_08_强软弱虚四种引用及应用场景
  • 【Week Y2】使用自己的数据集训练YOLO-v5s
  • docker入门(一)—— docker概述
  • Hive借助java反射解决User-agent编码乱码问题
  • 学生课程数据库综合操作(SQL)
  • android 怎么自定义view
  • 【博士每天一篇文献-综述】Brain network communication_ concepts, models and applications
  • vue3实现输入框短信验证码功能---全网始祖
  • 【华为OD机试】绘图机器【C卷|100分】
  • 虚拟游戏理财 - 华为OD统一考试(C卷)
  • CVE-2019-5782:kArgumentsLengthType 设置偏小导致优化阶段可以错误的去除 CheckBound 节点