--- 异或应用 --- #### 目录 1. 思维导图 2. 概述 3. 常见问题解决 4. 参考 #### 思维导图 ![](https://i.loli.net/2019/01/11/5c37f3306e40c.png) #### 概述 异或运算就是相同的元素运算结果等于 0,不相同的元素异或等于 1。 基于此,异或有以下特性: 1. a^a = 0 相同的数异或为零。 2. a^0 = a 任何数与零异都为其本身。 3. a = a ^ b ^ b #### 常见问题 ##### 1. 不用中间变量交换 a 和 b ```java 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 的所有整数,但缺少一个数,求这个数? ```java 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. 一个整形数组除了一个数只出现一次,其他都出现两次,求这个数? ```java 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. 一个整形数组除了两个数只出现一次,其他都出现两次,求这两个数? ```java 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 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. 一个整形数组除了三个数只出现一次,其他都出现两次,求这三个数? ```java 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 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); } ``` #### 参考 [异或应用小总结](https://blog.csdn.net/hulamua/article/details/52411446)