56-01 数组中只出现一次的两个数字
题目
一个整数数组里除了两个数字出现一次,其他数字都出现两次。请找出这两个数字。要求时间复杂度为o(n),空间复杂度为o(1)。
C++ 题解
两个相同的数字异或等于0。
如果数组中只有一个数字只出现一次,我们从头到尾异或每个数字,那么最终的结果刚好是那个只出现一次的数字。
而本题里数组中有两个数字只出现一次,如果能够将数组分为两部分,两部分中都只有一个数字只出现一次,那么就可以解决该问题了。
我们依旧从头到尾异或每个数字,那么最终的结果就是这两个只出现一次的数字的异或结果,由于两个数不同,因此这个结果数字中一定有一位为1,把结果中第一个1的位置记为第n位。现在我们以第n位是不是1为标准把元数组中的数字分成两个子数组,第一个子数组中每个数字的第n位都是1,而第二个子数组中每个数字的第n位都是0。
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
// 定义异或操作的结果
int Xor = 0;
// 从头到尾遍历数组异或
for(int i=0;i<nums.size();i++)
{
Xor ^= nums[i];
}
// 定义两个数字不相同的位数
int bit1pos = 1;
// 根据异或的结果找到两个数字不同的数字的位置
while(Xor)
{
if((Xor & 1) == 1)
break;
Xor >>= 1;
bit1pos <<= 1;
}
// 从头到尾遍历并进行异或操作
int value1 = 0,value2 = 0;
for(int i=0;i<nums.size();i++)
{
if(nums[i] & bit1pos)
{
value1 ^= nums[i];
}
else
{
value2 ^= nums[i];
}
}
return vector<int> {value1,value2};
}
};
python 题解
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
if len(nums) < 2:
return []
Xor = 0
for i in nums:
Xor ^= i
bitOfdiff = 1
while Xor:
if Xor & 1:
break
Xor >>= 1
bitOfdiff <<= 1
value1 = 0
value2 = 0
for i in nums:
if i & bitOfdiff:
value1 ^= i
else:
value2 ^= i
return [value1,value2]