假设两个只出现一次的数为 a 和 b,先把所有的数做异或,这样的得到的结果为 a^b,如果 a^b 的二进制形式的某一位是 1,说明 a 和 b 两个数在这一位上不同,可以根据这一位把所有的数分为两个组,一组是这一位为 1 的,一组是这一位为 0。如果两个数相同,那么这样两个数肯定会分到同一组。但是 a 和 b 会被分到不同的组。这样,对任意一组的全部数字执行异或操作,那么就会得到 a 和 b 其中的一个。再用其中的一个和 a^b 做异或运算就可以得到另外一个数字。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution { publicint[] singleNumber(int[] nums) { intaXORb=0; for (int i : nums) { aXORb ^= i; } // the last bit that a diffs b intmask= (aXORb & (aXORb - 1)) ^ aXORb;
inta=0; for (int i : nums) { if ((i & mask) != 0) { a = a ^ i; } } returnnewint[]{a, a ^ aXORb}; } }