题目:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:
因为只有两个只出现一次的数字,所以所有数字进行异或之后得到值res一定不是0.这样,res中其中至少1bit不是0,我们根据这个bit是否为0把数组分为两组,两个只出现一次的数字肯定在不同的组。其他出现两次的数组两个肯定在相同组,而两个相同的数组异或之后是0,任意一个数字与0异或还是该数字本身。
代码:
class Solution { public:void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {if(data.size()<=1) return;int res=data[0];for(int i=1;i<data.size();++i)res=res^data[i];int k=find1Index(res);*num1=0;*num2=0;for(int i=0;i<data.size();++i){if(kBitIs1(data[i],k))*num1=(*num1)^data[i];else*num2=(*num2)^data[i];}} private:bool kBitIs1(int num, int k){return ((num>>k)&1)!=0;}int find1Index(int num){//找最右边的1的位数int k=-1;while(num){++k;if(num&1){//++k;这句应该不管if-else都要执行才对return k;}elsenum=num>>1;//不能只写成num>>1; }return k;} };