您可以使用与一个和两个不同值的较简单情况类似的方式进行此操作。
每个数字位(例如32位)需要两个整数。对于每个数字,如果该位为零,则将第一个整数与其异或。如果不是,则将第二个整数与其异或。
另外,请记下在每个位置找到1或0的次数(我们只需要检查这是偶数还是奇数,因此请保留布尔值)。
迭代之后,我们的整数对将是以下之一。这里的第一个数字表示偶数,第二个数字表示奇数。
0, a^b^ca^b, ca^c, bb^c, a
对于每对,检查偶数整数。如果为零,则我们知道另一个整数是a ^ b ^ c,因为我们的结果中没有两个相等。否则,我们会在奇数计数整数处找到一个值。
public static int[] find3(int[] list) { int[][] xors = new int[32][2]; boolean[] counts = new boolean[32]; for (int curr : list) { for (int i = 0; i < 32; i++) { xors[i][(curr & (1 << i)) >> i] ^= curr; counts[i] ^= ((curr & (1 << i)) == (1 << i)); } } // this really shouldn't take so many lines int[] ret = new int[3]; int found = 0; for (int i = 0; i < 32; i++) { int oddCount = xors[i][counts[i] ? 1 : 0]; int evenCount = xors[i][counts[i] ? 0 : 1]; if (evenCount != 0) { // avoid the 0, a^b^c case. if (found == 0) { ret[0] = oddCount;// a ret[2] = evenCount;// b^c for now found++; } else if (found == 1 && ret[0] != oddCount) { ret[1] = oddCount;// b ret[2] ^= oddCount;// (b^c)^b == c break; } } } return ret;}


