LeetCode链接: link.
解题思路:
只有两个元素出现一次,其它的元素都出现两次.
全部元素异或消掉出现两次的数字. 异或的结果为i.
此时就用这个i去任意找一个bite位为1的,就可以将数组才分为这个bite位为1的和这个bite位不为1的。(数组全部异或完以后的这个i值,里面的每一个bite位都是两个数独有的)
那么再进行组内异或,就可以得到那个单独值,也就把异或的结果值进行了拆分。
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int i = 0;
for(auto& e : nums)
{
i ^= e;
}
//此时数组中重复的数就被全部异或掉了,剩下的是两个不同元素异或的结果
//这里不要担心,总会找到那个bite位为1的值,找不到就出现问题了
int m = 0;
while(m<32)
{
if(i & (1<<m))
break;
else
++m;
}
//此时就通过那个找到的bite位的1,将数组中所有的数,划分为了两个阵营的,一个是这个bite为有1,一个是没有的
int x1 = 0,x2 = 0;
for(size_t i = 0;i<nums.size();++i)
{
if(nums[i] & (1<<m))
{
x1 ^= nums[i];
}
else
{
x2 ^= nums[i];
}
}
//为了节省代码,这里直接返回了一个匿名对象,且匿名对象中的数为x1和x2
return vector<int>{x1,x2};
}
};
版权声明:本文为MEANSWER原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。