首先回顾,如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字? 思路是将这个数组元素相异或。
class Solution {
public int[] singleNumbers(int[] nums) {
int z = 0;
for(int num:nums){
z^=num;//获得的z为两个不同的数x与y异或的结果。 根据异或的性质可知,z中至少有一位是1、下面要找出这个位。
}
int m = 1;
while((z&m) == 0){m<<=1;}
int x = 0,y = 0;
for(int i:nums){
if((i&m) == 0){x^=i;}
else {y^=i;}
}
return new int[]{x,y};
}
}