【剑指offer】面试题40:数组中只出现一次的数字
题目:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:
因为只有两个只出现一次的数字,所以所有数字进行异或之后得到值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; } else num=num>>1;//不能只写成num>>1; } return k; } };