这题的关键在于如何分开两个数。所有数的异或,这个数中位数位为1就是两个数的分叉点,对于其他数来说,在这个位上要么是0,要么是1,两次异或后都是0.具体代码如下
1 public class Solution { 2 public int[] singleNumber(int[] nums) { 3 int twoNum = 0; 4 for (int i = 0; i < nums.length; i++) 5 { 6 twoNum = twoNum ^ nums[i]; 7 } 8 int shift = 0; 9 while ((twoNum & 1) == 0) 10 { 11 twoNum >>= 1; 12 shift++; 13 } 14 twoNum = 1 << shift; 15 int[] ans = new int[2]; 16 for (int i = 0; i < nums.length; i++) 17 { 18 if ((twoNum & nums[i]) != 0) 19 { 20 ans[0] = ans[0] ^ nums[i]; 21 } 22 else 23 { 24 ans[1] = ans[1] ^ nums[i]; 25 } 26 } 27 return ans; 28 } 29 }
取得一个数上的位数为1的位还有其他简单的办法,但难于理解。