1.找单身狗 ,一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。
在做这个题目之前要理解一个知识点,
1、相同两个的数字异或得0 例如3^3=0
2、任何数字和0异或得数字本身 例如3^0=3
#include<stdio.h>
int main()
{int arr[]={1,2,3,4,1,2,3,4,5};int sz=sizeof(arr)/sizeof(arr[0]);int ret=0;for(int i=0;i<sz;i++){ret^=arr[i];}printf("%d\n",ret);return 0;
}
2、一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。
根据第一个题目,寻找单身狗是十分的容易的,
如果这个能像第一个一样就好了,寻找是十分的快的
有了这个想法,想到了分组。
#include<stdio.h>
int main(){int arr[]={1,2,3,4,5,1,2,3,4,6};//5和6是单个出现的int sz=sizeof(arr)/sizeof(arr[0]);//5的二进制是101//6的二进制是110//两个异或是 011//分组就是看哪一二进制位1 把二进制为1的分成1组 其余的为一组//比如按最后以为是1的进行一组//a组是:1,1,3,3,5//b组是:2,2,4,4,6//计算5,6的异或int ret=0;for(int i=0;i<sz;i++){ret^=arr[i];}//寻找哪一位的二进制为1int pos=0;for(int i=0;i<32;i++){if((ret>>i)&1==1){pos=i;break;}}//分组int num1=0;int num2=0;for(int i=0;i<sz;i++){if((arr[i]>>pos)&1==1)num1^=arr[i];elsenum2^=arr[i];}return 0;
}