- 将数组全部异或,相同的将抵消,得出两个不同的值的异或
- 该值(二进制)为1的位则是两值不同的位,根据该位分组,两个值将会被分到不同的组,而相同的值会被分到一组(可被抵消),不同组内重新进行异或,则两个值会被分离
- 如何得出该值:ret ^= (-ret),因为ret和-ret加起来等于0的缘故,所以只有最后一位1会相同,最后一位1左侧是每一位都不同,最后一位1右侧是全为0
- 如何分组:与该值进行与操作
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int ret = 0;
// 计算两个不同数的异或值
for(int e : array) {
ret ^= e;
}
// 计算两个不同数不同的位数
ret &= -ret;
// 分组
for(int e : array) {
if((e & ret) == 0) {
num1[0] ^= e;
} else {
num2[0] ^= e;
}
}
}
}