题目:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:
(1)首先考虑数组中若是只有一个数字是出现一次,其他都是出现两次的情况,在这种情况下,将所有的
数字都位异或运算(^),因为相同的数字异或结果为0,所以最后地到的结果就是那个出现一次的数。
(2)下面考虑本题出现有两个出现一次,其他的都是出现一次,这种情况下,可以将所有的异或一遍,
那么最后得到的结果为这两个出现一次的数的异或的结果。
然后找到这个数的从右为0数起的第一个不为0的位,这样可以根据这个位将这个数组分成两部分,一部分
这个第n位为0,一部分这个第n位为1.
然后再分别异或,最后得到的两个结果就是了。
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 //找到这个数的右起第几位不为0. 6 int number_of_first_one(unsigned int a) 7 { 8 int re=0; 9 for(int i=0;i<32;i++) 10 { 11 if((a&(1<<i))!=0) 12 {re=i;break;} 13 } 14 return re; 15 } 16 17 //判断右起第n位是否为1 18 bool ifone(unsigned int a,int n) 19 { 20 if(a&(1<<n)) 21 return 1; 22 else 23 return 0; 24 } 25 26 //主函数。 27 void find_number(vector<int>& vec,int *num1,int *num2) 28 { 29 if(vec.empty()) 30 return; 31 int len=vec.size(); 32 if(len<=1) 33 return; 34 35 unsigned int a=vec[0]; 36 for(int i=1;i<len;i++) 37 a^=vec[i]; 38 39 int n=number_of_first_one(a); 40 *num1=0; 41 *num2=0; 42 for(int i=0;i<len;i++) 43 { 44 if(ifone(vec[i],n)) 45 *num1^=vec[i]; 46 else 47 *num2^=vec[i]; 48 } 49 } 50 int main() 51 { 52 int ary[8]={2,4,3,6,3,2,5,5}; 53 vector<int> vec(ary,ary+8); 54 int num1; 55 int num2; 56 find_number(vec,&num1,&num2); 57 cout<<num1<<endl; 58 cout<<num2<<endl; 59 system("pause"); 60 }
时间: 2024-09-27 04:27:12