1. 题意
一个数字中两个数出现一次,其他数出现了两次。找出这两个数。
只出现一次数字III
2. 题解
将所有数异或起来可以得到xsum = a^b
。
只需要将两个数分开即可。
我们根据一个分类标准将数组分为两个部分,再将两个部分分别异或就可以得到a b
。
这个分类标准就是a b
共同的最低1
位。
即xsum & (-xsum)
。
需要一点点计算机存储整数的知识。
注意处理xsum == INF_MIN
的情况!!!
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int xsum = 0;
for ( int num: nums)
xsum ^= num;
int mask = (xsum == INT_MIN ? xsum : (xsum & -xsum));
int a = 0;
int b = 0;
for ( int num: nums) {
if (num & mask)
a ^= num;
else
b ^= num;
}
return {a, b};
}
};