考点:位运算
按难易程度排序
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret = 0;
for(size_t i = 0; i < nums.size(); i++)
{
ret ^= nums[i];
}
return ret;
}
};
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
/*
a ^ a ^ b ^ c
b和c必定有相异的地方为1
找出那个位置
然后按照那个位置 是0或者1 对数组进行分组
相同的必然在一边,分开计算数字
*/
//找到 b ^ c
int n = 0;
for(size_t i = 0; i < nums.size(); i++)
{
n ^= nums[i];
}
//找到b和c必定有相异的地方为1,转化成寻找二进制中的1,用&
int p = 1;
while((n & 1) == 0)//有0则为0,找到1
{
n >>= 1;
p <<= 1;
}
int x = 0,y = 0;
for(size_t i = 0; i < nums.size(); i++)
{
//那个位置是0的话,按位且的结果必定是0
if(nums[i] & p)
{
x ^= nums[i];
}
else
{
y ^= nums[i];
}
}
return vector<int>{x, y};
}
};
class Solution {
public:
int singleNumber(vector<int>& nums) {
/*
a = 0 b = 0
第一次遇到x
a b
0 ^ x = x; x & ~0 = x;
b a
0 ^ x = x;x & ~x = 0,
结束后 a = x;b = 0; 10
第二次遇到x
a b
x ^ x = 0; 0 & ~0 = 0,
b
0 ^ x = x, x & ~0 =x;
结束后 a = 0; b = x; 01
第三次遇到x
a b
0 ^ x = x, x & ~x = 0;
b a
x ^ x = 0; 0 & ~0 = 0;
结束后 a = 0; b = 0;
*/
int a = 0, b = 0;
for(size_t i = 0; i < nums.size(); ++i)
{
a = (a ^ nums[i]) & ~b;
b = (b ^ nums[i]) & ~a;
}
return a;
}
};