题目:
一个整型数组里除了两个数字之外,其他数字都出现了两次,请写出程序找出这两个只出现一次的数字。
思路:
我一开始想到的就是直接用哈希表,空间换时间,但这种方法通常是在时间复杂度比较高,且没办法再改良时间复杂度的情况下做的选择,我们这里还有别的方法可以选择。
首先我们考虑这个数字中如果只有一个数字只出现了一次,其他都是两次,那么怎么找到这个数字呢,其实异或运算就很好解决这种问题,异或完所有数字后就只剩一个没重复的数字。
所以我们是不是可以把这个思路运用到原始的问题里面去呢,最好的办法就是把这两个只出现一次的数字放到两个不同的数组里去,从而实现每个数字里头最后异或运算结果后分别得到一个数字,问题就再次简化成如何把这两个数分开,这个数组没有什么别的特点,无序,就只有数字上有特点,所以我们还是可以用这个异或的方法,当我们把整个数组里的数字进行异或运算后其实就是那两个数字进行异或运算的结果。结果肯定不为0,所以这个结果数字转化为2进制结果后就会一定存在一位为1,我们直接取第一个为1的位置,记为第n位。所以我们以第n位是不是1位标准把原数组中的数字分为两个数组,再分别进行异或运算就好了。
代码实现:
int* singleNumbers(int* nums, int numsSize, int* returnSize){
int ret=0,i=0,num1=0,num2=0,pos=0;
int* arr=(int*)malloc(2 * sizeof(int));
for(i=0;i<numsSize;i++){
ret^=num[i];
}
for(i=0;i<32;i++){
if((ret>>i)&1==1){
pos=i;
break;
}
}
for(i=0;i<numsSize;i++){
if((nums[i]>>pos)&1==1){
num1^=num[i];
}
else{
num2^=num[i];
}
}
arr[0]=num1;
arr[1]=num2;
*returnSize=2;
return arr;
}