You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
android-notes/blogs/Algorithm/异或应用.md

2.9 KiB

异或应用

目录

  1. 思维导图
  2. 概述
  3. 常见问题解决
  4. 参考

思维导图

概述

异或运算就是相同的元素运算结果等于 0,不相同的元素异或等于 1。

基于此,异或有以下特性:

  1. a^a = 0

    相同的数异或为零。

  2. a^0 = a

    任何数与零异都为其本身。

  3. a = a ^ b ^ b

常见问题

1. 不用中间变量交换 a 和 b
    public static void main(String[] args) {
        int a = 2333;
        int b = 1234;
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
        System.out.println(a + " " + b);
    }
2. 一个整形数组,存 1 到 n 的所有整数,但缺少一个数,求这个数?
    public static void main(String[] args) {
        int[] ints = new int[233];
        for (int i = 0; i < 233; i++) {
            ints[i] = i;
        }
        ints[23] = 0;
        int result = 0;
        for (int i = 0; i < ints.length; i++) {
            result = i ^ result;
        }
        for (int i : ints) {
            result = i ^ result;
        }
        System.out.println(result);
    }
3. 一个整形数组除了一个数只出现一次,其他都出现两次,求这个数?
    public static void main(String[] args) {
        int[] ints = new int[]{2, 3, 4, 5, 3, 4, 5, 7, 2, 9, 0, 7, 0};
        int result = 0;
        for (int i : ints) {
            result = result ^ i;
        }
        System.out.println(result);
    }
4. 一个整形数组除了两个数只出现一次,其他都出现两次,求这两个数?
    public static void main(String[] args) {
        int[] ints = new int[]{2, 5, 2, 9, 7, 5, 6, 9};
        int num = 0;
        for (int i : ints) {
            num = num ^ i;
        }
        ArrayList<Integer> list = new ArrayList<>();
        for (int i : ints) {
            if (list.contains(num ^ i)) {
                list.remove(Integer.valueOf(num ^ i));
            } else {
                list.add(num ^ i);
            }
        }
        System.out.println(list.get(0));
        System.out.println(list.get(1));
    }
5. 一个整形数组除了三个数只出现一次,其他都出现两次,求这三个数?
public static void main(String[] args) {
    int[] ints = new int[]{2, 5, 2, 9, 7, 5, 6, 9, 8};
    int num = 0;
    for (int i : ints) {
        num = num ^ i;
    }
    ArrayList<Integer> list = new ArrayList<>();
    for (int i : ints) {
        if (list.contains(num ^ i)) {
            list.remove(Integer.valueOf(num ^ i));
        } else {
            list.add(num ^ i);
        }
    }
    System.out.println(list.get(0) ^ num);
    System.out.println(list.get(1) ^ num);
    System.out.println(list.get(2) ^ num);
}

参考

异或应用小总结