只出现一次的数字
- 136. 只出现一次的数字 - 力扣(LeetCode)
【解题思路】
异或
- 以二进制进行运算
- 相同为0,相异为1
class Solution {
public:
int singleNumber(vector<int>& nums) {
//异或
int val = 0;
for(auto num : nums){
val ^= num;
}
return val;
}
};
- 137. 只出现一次的数字 II - 力扣(LeetCode)
【解题思路】
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;
}
};
- 260. 只出现一次的数字 III - 力扣(LeetCode)
【解题思路】
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;
}
};