数组中只出现一次的数字(一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字):
解法在于位运算中的异或,直接异或可以得到这两个数的异或,按照最后的有效数字位可以分为两个数组,然后分别异或得到各自的值;
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { if(data.size()==0) return; *num1=0; *num2=0; vector<int> data1,data2; int res=0,flag=0; for(auto &i : data) res^=i; while(!(res&1)){ res>>=1; flag++; } int num=1<<flag; for(auto &i : data){ if(i&num) data1.push_back(i); else data2.push_back(i); } for(int &i : data1) *num1^=i; for(int &i : data2) *num2^=i; return; }
二进制中1的个数:
int NumberOf1(int n) { int count=0; while(n){ count++; n=n&(n-1); //把最后的1给消除掉,总共消除了几次,就证明有几个1 } return count; }