解法一:位运算(推荐)

既满足时间复杂度又满足空间复杂度,就要提到位运算中的异或运算 XOR,主要因为异或运算有以下几个特点:

  • 一个数和 0 做 XOR 运算等于本身:a⊕0 = a
  • 一个数和其本身做 XOR 运算等于 0:a⊕a = 0
  • XOR 运算满***换律和结合律:a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b
    故而在以上的基础条件上,将所有数字按照顺序做抑或运算,最后剩下的结果即为唯一的数字

:将数组[4, 1, 2, 1, 2]的第一项与之后的元素进行位运算
4^1^2^1^2 = 100 -> 101 -> 111 -> 110 -> 100 = 4

化简后可得

4^(1^1)^(2^2) = 100 = 4

参考手绘图解:

图片说明

图片说明

C++参考代码:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        // 答案数组
        vector<int> ans(2);
        int res = 0;
        //对数组遍历进行异或运算
        for(int x : array){
            res ^= x;
        }
        int m = 1;
    // 找到二进制上第一个1,该位置上