给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :
输入: [1,2,1,3,2,5]
输出: [3,5]
注意:
结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。
你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/single-number-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
写题思路:一开始想用hash但是C语言中就是弄个不出来,负数问题也考虑到了,但是就是会出现申请的空间不足的情况,所以半天没搞出来,之后去评论区和题解那里看了看,用的异或运算把只出现一次的异或值求出来(反复看了两个多小时才看明白,我脑子可能最近进水了),之后把异或值最右边第一次出现的1值提出来与原数组进行与运算,是的话就用异或运算循环从里面提取出需要的两个数之一,另一个直接就是挑剩下的异或运算即可。
代码如下:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* singleNumber(int* nums, int numsSize, int* returnSize){
int i,y,num=0;
int *a=(int*)calloc(2,sizeof(int));
*returnSize=2;
for(i=0;i<numsSize;i++)
num ^= nums[i];
y = num&(-num);
for(i=0;i<numsSize;i++)
if(y&nums[i])
a[0] ^= nums[i];
else
a[1] ^= nums[i];
return a;
}