题解 | #数组中只出现一次的两个数字# 妙蛙 位运算
数组中只出现一次的两个数字
https://www.nowcoder.com/practice/389fc1c3d3be4479a154f63f495abff8
class Solution {
// 题解中 使用位运算 更妙 不依赖哈希表
// https://www.nowcoder.com/practice/389fc1c3d3be4479a154f63f495abff8?tpId=295&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindNumsAppearOnce(vector<int>& array) {
// write code here
int n = array.size();
vector<int> ans(2,0);
// a, b 就是那唯2的元素 全部异或
int temp = 0;
for(int i=0; i<n; ++i)
{
temp^=array[i];
}
int k = 1;
while((k&temp)==0)
{
k <<=1; // 从低位到高位啊 找到首个 a和b不同的位置
}
// 在遍历一次 分组记录 a b
for(int i=0; i<n; ++i)
{
if((k & array[i])==0)
{
// 会包含较小的数 两者中 有一个值计算一次 就是本身
ans[0] ^= array[i];
}
else
{
ans[1] ^= array[i];
}
}
if(ans[0]>ans[1]) swap(ans[0], ans[1]);
return ans;
}
};
空间复杂度就为0了