image.png

思路

1.对所有数字异或,一样的数字抵消,出现一次的两个数字异或运算后必定不为0;
2.这个数字和相反数做与运算得到一个二进制位最右边一位为1的数字;
3.mask和数组的每个数字做与运算,等于0的分为一组,等于mask的分为一组,同时也将两个不一样的数字分开;
4.完结。

code

  1. public int[] singleNumber(int[] nums) {
  2. int xor = 0;
  3. for (int i : nums)// 一样的抵消,不一样的两个数字异或运算结果必定有一位是1
  4. xor ^= i;
  5. int mask = xor & (-xor);
  6. int[] ans = new int[2];
  7. for (int i : nums) {
  8. if ((i & mask) == 0)//== 0、 == mask 两种结果
  9. ans[0] ^= i;
  10. else
  11. ans[1] ^= i;
  12. }
  13. return ans;
  14. }