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