异或运算:
a ^ a = 0
a ^ 0 = a
异或运算与顺序无关
a ^ b = b ^ a
题目一
一个数组只有一个数出现奇数次,其他都出现了偶数次,求这个数。
思路:一直异或即可,因为出现偶数次的异或后都会变成0,最后就只剩出现奇数次的数。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
//接下来有n个数
int n = in.nextInt();
int result = 0;
for(int i = 0;i < n;i++){
int temp = in.nextInt();
result ^= temp;
}
System.out.println(result);
}
}
题目二
一个数组一个数组只有一个数出现奇数次,其他都出现了偶数次,求两个数。
思路:
假设两个奇数是a,b,还是一直异或,最终的结果是a ^ b(令他等于c)。我们只需要再求到其中一个即可。
a != b ,所以必然有个位置a != b(二进制上),这个位置在c上就为1。
我们找到这个位置的1,用它去与数组中的数做且运算,不为0说明该数在该位置上为1,他就有可能是a,b中的一个。
我们把这些可能的数都做异或运算,如果不是a或b,那么它们最终运算结果会等于0,最终留下的就是a或b。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
//接下来有n个数
int n = in.nextInt();
int result1 = 0;
int[] numbers = new int[n];
for(int i = 0;i < n;i++){
int temp = in.nextInt();
numbers[i] = temp;
result ^= temp;
}
//取出第一个 1
int firstOne = result & (~result + 1);
int result2 = 0;
for(int i = 0;i < n;i++){
if((numbers[i] & firstOne) != 0){
result2 ^= numbers[i]
}
}
System.out.println(result2);
System.out.println(result1 ^ result2);
}
}