题目描述
题目分析
其实我们就可以看出来,xorRet 二进制序列中的1的位置对应两个出现一次的数字的二进制序列的位置有着规律
————>xorRet 为1的位置,出现一次的数字x1,x2的位置必然一个是0一个是1。那么问题的解决方法就有了
1、把数组中所有数异或为xorRet
2、取xorRet中的1的位置。
3、根据这个位置对数组中所有元素进行分组,那两个只出现一次的不同数字必然被分到了不同的组中,其他
相同的数字也被分到了一组中。
4、对两组中的数字进行异或。每组最后的异或结果就是x1和x2。
题目实现
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
//思路:把数组中的元素依次全部异或,相同数字必然异或成了0,而且异或也满足结合律,不同的数字异或的结果是非0数字
// 则最后异或的结果就是数组中两个不同数字的异或的结果
int* singleNumbers(int* nums, int numsSize, int* returnSize){
//1、依次异或
int xorRet = 0;
for(int i = 0;i < numsSize;++i)
{
xorRet ^= nums[i];
}
//2、选出1位置
int m = 0;
while(m < 32)
{
if(xorRet & (1<<m))
{
break;
}
else
{
++m;
}
}
//3、分组把x1 x2 分离
int x1 = 0;
int x2 = 0;
for(int i = 0;i < numsSize; i++)
{
if(nums[i] & (1<<m)) //和上面如法炮制
{
x1 ^= nums[i];
}
else
{
x2 ^= nums[i];
}
}
int* retArr = (int*)malloc(sizeof(int)*2);
retArr[0] = x1;
retArr[1] = x2;
*returnSize = 2;
return retArr;
}
到这里就完美解决了!