真的是对二进制的题目,遇到一个就蒙圈一个,

这道题是对数组中只有一个出现一次的数字,其他数字都出现2次的二进制解法的增强,可以对比记忆。

import java.util.*;


public class Solution {
    public int[] FindNumsAppearOnce (int[] a) {
        if (a == null || a.length < 2) {
            return null;
        }
        int[] ans = new int[2];
        int res = 0;
        for (int x : a) {
            res ^= x;
        }
        int m = 1;
        while ((m & res) == 0) {
            m = m << 1;
        }
        for (int x : a) {
            if ((m & x) == 0) { // 将a中的数字按照第m位是否为1区分,区分后每个子数组中只有一个出现一次的数
                ans[0] ^= x;
            } else {
                ans[1] ^= x;
            }
        }
        if (ans[1] < ans[0]) {
            int tmp = ans[0];
            ans[0] = ans[1];
            ans[1] = tmp;
        }
        return ans;
    }
}