• 将数组全部异或,相同的将抵消,得出两个不同的值的异或
  • 该值(二进制)为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;
            }
        }
    }
}