只出现一次的数字
【解题思路】
采用异或位运算来求解。当数组中两个相同数进行异或时为0;数组中只有一个数出现一次,这个数异或0还会等于它本身。
异或
- 以二进制进行运算
- 相同为0,相异为1
class Solution {
public:
int singleNumber(vector<int>& nums) {
//异或
int val = 0;
for(auto num : nums){
val ^= num;
}
return val;
}
};
【解题思路】
- 开个大小为32的数组,存放所有数的中每个为1的数
- 得到两种情况1.刚好是3的倍数,2.是3的倍数+1
- 找出3n+1的数进行异或
class Solution {
public:
int singleNumber(vector<int>& nums) {
vector<int> bitarray;
bitarray.resize(32);
//统计所有数二进制位为1的数
for (auto n : nums) {
for (int i = 0; i < 32; i++) {
if (n & (1 << i))
bitarray[i]++;
}
}
//0异或bitarray%3 == 1的数
int val = 0;
for(size_t i=0;i<32;i++)
{
if(bitarray[i]%3 == 1)
val ^= (1<<i);
}
return val;
}
};
【解题思路】
- 将数组进行异或,最终得到的就是就是两个单独出现数的异或的结果
- 找出两个单独出现数的异或的结果中二进制位1的数
- 将数组进行分离,该数的二进制位第i位1的为一组,为0的一组
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
vector<int>abs;
abs.resize(2);
//将数组异或,最终得到两个数异或的结果
int ret =0;
for(int n : nums)
{
ret ^= n;
}
//找出两个数异或的结果二进制位为1的位
int i=0;
for(;i<32;i++)
{
if((ret>>i)&1)
break;
}
//将数组进行分离,该数的二进制位第i位1的为一组,为0的一组
for(int n :nums)
{
if((n>>i)&1)
abs[0]^=n;
else
abs[1]^=n;
}
return abs;
}
};
else
abs[1]^=n;
}
return abs;
}
};