public class Test7 {
public static void main(String[] args) {
int[] nums = {4,1,4,6};
singleNumbers(nums);
}
public static int[] singleNumbers(int[] nums) {
/**
* 异或操作:a^a=0, a^0=a, a^b^a=b
* 通过异或操作可以查找到数组中 只出现一次的两个数a^b的结果
* 与操作:a&a=0, a&0=0,
* 由于两个数不相等,因此异或结果必然有一位为1,通过(m <<=1)&(a^b)查找那位1
* 将数组分为两个子数组,根据 (num&m)==0?x^=num:y^=num
*/
int z = 0;
for(int num: nums){
z ^= num;
}
int m = 1;
while((z&m)==0){
m <<=1;
}
int x=0, y=0;
for(int num: nums){
if((num&m)==0){
x ^= num;
}else{
y ^= num;
}
}
return new int[]{x, y};
}
}