力扣题目
给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。
示例 1:
输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。
示例 2:
输入:nums = [-1,0]
输出:[-1,0]
示例 3:
输入:nums = [0,1]
输出:[1,0]
代码
思路分析:
1.异或两个相同的数,等于没有异或,经常用于消除出现两次的数字
2.x &-x 可以生成一个保留最右边 bit为1的数字,其他bit都置为0
3.两个只出现1次的数字,那么这个Bit1不是x就是y的,再一次&全部的数字,就可以得到x或者y
此题还是有难度的,我看了好多题解才理解上去。
int* singleNumber(int* nums, int numsSize, int* returnSize)
{
long long OR = 0;/*代表数组元素异或后的值*/
int i= 0, result1 = 0, result2 = 0;
long long flag = 0;
int *arr = (int *)malloc(sizeof(int) * 2);
/*对数组进行异或处理*/
for(i= 0; i < numsSize; i++)
{
OR ^= nums[i];
}
/*生成一个保留最右边 bit为1的数字,其他bit都置为0*/
flag = OR & (-OR);
for(i= 0; i < numsSize; i++)
{
if((flag & nums[i]) != 0)/*说明数组此元素的flag位为1*/
{
result1 ^= nums[i];/*最终得到与flag位相同的那个数字*/
}
}
result2 = result1 ^ OR;/*得到另一个数字*/
arr[0] = result1;
arr[1] = result2;
*returnSize = 2;
return arr;
}