public static void main(String[] args) {
// 位运算比算术运算快得多
int[] arr = {1, 1, 2, 2, 2, 3, 3, 6, 6, 6, 7, 7};
int eor = 0;
// 异或结果不为0,则说明存在两个奇数个的数字
for (int i : arr) {
eor ^= i;
}
// 0010 ^ 0110 = 0100
// System.out.println(eor); // 输出结果:4
// 获取最右边的1
int rightOne = eor & (~eor + 1);
int onlyOne = 0;
// 获取其中一个奇数个的数字
for (int i : arr) {
// 判断当前数字是否包含最右边的1
if ((i & rightOne) == 1) {
// 包含最右的1
onlyOne ^= i;
}
}
// 输出第一个奇数个的数字和第二个奇数个的数字
System.out.println((eor ^ onlyOne) + " " + onlyOne);
}
输出结果: 2 6