解法一:位运算(推荐)
既满足时间复杂度又满足空间复杂度,就要提到位运算中的异或运算 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,该位置上