剑指offer算法题

数组中只出现一次的数字(一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字):

解法在于位运算中的异或,直接异或可以得到这两个数的异或,按照最后的有效数字位可以分为两个数组,然后分别异或得到各自的值;

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;
     }

  

猜你喜欢

转载自www.cnblogs.com/zhang-qc/p/9178476.html