LeetCode 只出现一次的数字III

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :

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

注意:

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

请先翻阅 LeetCode 只出现一次的数字
此题就是nums中存在两个出现一次的元素。
思路分析:

第一步:将所有元素进行异或,得到只出现一次的两个元素A、B的异或结果。
第二步:根据上一步得到的异或结果,寻找这两个元素中最低位(32位整型)第一个出现为1的位置
第三步:根据第二步得到的位置,将原数组中的元素分成两个部分进行异或。得到的两个结果即为解。

解释关于第三步为什么可以利用第二步的结果进行分类:如果A、B为两个不同的数,那么转换为32位2进制时,从低位开始寻找,必定会出现有一个为1,且另外一个为0的位。而将A^B的结果中转换为32位2进制,最低为1的位就是前面所寻找的位。(因为1异或0等于1)这样就可以利用这个位的不同,将原数组分成两类,继而转换成两个 只出现一次的数字的问题。

class Solution {
public:
	vector<int> singleNumber(vector<int>& nums) {
		int tempRes = 0;
		//将所有元素异或,得到的结果为出现一次的A^B
		for (auto num : nums) {
			tempRes ^= num;
		}
		//从后往前找出第一位为1的位置
		int diffNum = 1;
		while ((tempRes & diffNum) == 0) {
			diffNum <<= 1;
		}
		int resultA = 0, resultB = 0;
		//根据元素种类进行分类
		for (auto num : nums) {
			if (diffNum & num) {
				resultA ^= num;
			}
			else {
				resultB ^= num;
			}
		}
		vector<int> result = { resultA, resultB };
		return result;
	}
};

LeetCode 只出现一次的数字III