56-01 数组中只出现一次的两个数字

题目

一个整数数组里除了两个数字出现一次,其他数字都出现两次。请找出这两个数字。要求时间复杂度为o(n),空间复杂度为o(1)。

LeetCode

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]                
posted @ 2019-03-17 13:54  youngliu91  阅读(116)  评论(0编辑  收藏  举报