leetcode刷题—260.只出现一次的数字III

260.只出现一次的数字III

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。来源:力扣(LeetCode)

示例 :

输入: [1,2,1,3,2,5]
输出: [3,5]

解决方案:异或与位运算
相同数字异或操作为零,对所有数字异或操作,得到出现一次的数字的异或值,用mask,然后mask&(-mask)得到mask最后一个1的位置,是两个数字其中一个的,根据这个差异把所有数字分为两部分进行异或,最后得到两个只出现一次的数字。
示例:
在这里插入图片描述
C++:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int mask = 0;
        for(auto n:nums){
            mask^=n;
        }
        int diff = mask&(-mask);
        int x = 0,y = 0;
        for(auto u:nums){
            if(diff&u){
                x^=u;
            }else{
                y^=u;
            }
        }
        return {x,y};
    }
};

Python3:

def singleNumber(self,nums:int)->List[int]:
	mask = 0;
	for n:nums:
		mask^=n
	diff = mask&(-mask)
	x,y=0,0
	for n:nums:
		if diff&n:
			x^=n
		else:
			y^=n
	return [x,y]

版权声明:本文为weixin_42846216原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。