package Once;
import java.util.Scanner;
//一个整型数组里除了1个数字之外,其他的数字都出现了两次,请写程序找出这个只出现一次的数字。
//要求时间复杂度是 O(n),空间复杂度是 O(1),
//例如输入数组{2, 4, 3, 3, 2, 5 },因为只有 4 这个数字只出现一次,其他数字都出现了两次,所以输出 4
//那么,当数组中有2个只出现1次的数字呢?例如输入数组{2, 4, 3, 3, 6, 2},
//因为4和6 这两个数字都只出现一次,其他数字都出现了两次,应输出 4,6
public class OnceNum {
public static void main (String[] args){
Scanner sc = new Scanner(System.in);
String[] tmp = sc.nextLine().split("\\s+");
int[] arr = new int[tmp.length];
for (int i = 0; i < tmp.length; i++)
arr[i] = Integer.parseInt(tmp[i]);
int p = 0;
for (int t : arr){
p = p^t;//任何数和0异或结果都是其本身,任何数和自己异或结果都是0.
//因此,异或的结果为剩下的那两个只出现一次的数
}
//找寻两个只出现一次的数16进制位上第一个不相同的位(低->高)
int index = 0;
while (index < 32){//一个int类型占4字节,一个字节8位
if (findBit(index, p))
break;
index++;
}
int a = 0;
int b = 0;
for (int t : arr){
if (findBit(index, t))
a = a^t;
else
b = b^t;
}
System.out.println(a);
System.out.println(b);
}
public static boolean findBit(int index, int num){
int r = (num>>index)&0x01;
if (r == 1) return true;
return false;
}
}