一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例 1:
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]
限制:
2 <= nums.length <= 10000
1.异或法
定义一个变量,使它与数组元素中的所有元素进行异或,得到两个出现1次数的异或值。
假如这两个数为:
00000000…00000010
011111111…11110000
找到任意一位为1的位,将原数组中改位为0和为1的分别放入两个不同的数组中,并进行异或得到两个出现一次的值。
int* singleNumbers(int* nums, int numsSize, int* returnSize){
int i,x=0;
//得到两个出现一次的异或值
for(i=0;i<numsSize;i++)
{
x^=nums[i];
}
//找出第m位为1的位置
int m=0;
while(m<31)
{
if((x>>m)&0x01)
{
break;
}
else
{
m++;
}
}
//将数组中m位为0和m位为1的分别放入不同的数组,并异或得到对应的数
int count1=0,count2=0;
for(i=0;i<numsSize;i++)
{
if(nums[i]&(1<<m))
{
count1^=nums[i];
}
else
{
count2^=nums[i];
}
}
int *result=(int*)malloc(sizeof(int)*2);
*returnSize=2;
result[0]=count1;
result[1]=count2;
return result;
}
以上就是用异或法求解,如果大家还有其他方法欢迎大家补充指正。