260. 只出现一次的数字 III

题目描述

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :
输入: [1,2,1,3,2,5]
输出: [3,5]
注意:

结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

思路

总体思路利用了136针对一个元素情况时的解法,针对这道题,需要做的是如何把数组中的元素分到要找的这两个不同元素所在的不同的"族"中。

代码实现

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
    	int n = nums.size();
    	if(n < 2)
    		return {};
    	int ab = 0;
    	for(int i = 0;i < n;i++)
    		ab^=nums[i];
    	int i = 0;
        //找出这两个数哪一位不同
        for(;i < sizeof(int)*8;i++)
        {
        	int mask = 1<<i;
        	if((mask & ab)!=0)
        		break;
        }
        int a = 0;
        int b = 0;
        for(int j = 0;j < n;j++)
        {
        	int mask = 1<<i;
        	if(mask & nums[j])
        		a^=nums[j];
        	else
        		b^=nums[j];
        }
        return {a,b};
        
    }
};

posted on 2021-06-13 15:46  朴素贝叶斯  阅读(22)  评论(0编辑  收藏  举报

导航