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.
2.9 KiB
2.9 KiB
异或应用
目录
- 思维导图
- 概述
- 常见问题解决
- 参考
思维导图
概述
异或运算就是相同的元素运算结果等于 0,不相同的元素异或等于 1。
基于此,异或有以下特性:
-
a^a = 0
相同的数异或为零。
-
a^0 = a
任何数与零异都为其本身。
-
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);
}