题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:将数字分成两组,每组包含一个只出现一次的数字,再异或求解,时间复杂度为O(logn),空间复杂度为O(1)
1 class Solution { 2 public: 3 void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { 4 if(data.size()==0)return; 5 int num=data[0]; 6 for(int idx=1; idx<data.size(); ++idx) 7 { 8 num=num^data[idx]; 9 } 10 if(num==0)return; 11 int tmp=1; 12 while(!(tmp&num))tmp=tmp<<1; 13 *num1=0; 14 *num2=0; 15 for(int idx=0; idx<data.size(); ++idx) 16 { 17 if(tmp & data[idx]) 18 { 19 *num1=(*num1)^data[idx]; 20 }else{ 21 *num2=(*num2)^data[idx]; 22 } 23 } 24 } 25 };