数组中只出现一次的数字

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        int a=0;
        int index=0;
        vector<int> data1;
        vector<int> data2;
        //所有的数都按位异或,结果是a,
        for(int i=0;i<data.size();i++)
        {
            a=a^data[i];
        }
        //取出a的最高位,依次与1取与,只有同为1,就可以判断出其位数
        while((a&1)==0&&index<32)
        {
            a=a>>1;//自身右移,要赋值回来
            index++;
        }
        //根据第一个1分组
        for(int i=0;i<data.size();i++)
        {
            if(judge(index,data[i]))
                data1.push_back(data[i]);
            else 
                data2.push_back(data[i]);
        }
        //分别遍历相异或得值
        a=0;
         for(int i=0;i<data1.size();i++)
        {
            a=a^data1[i];
        }
        *num1=a;

        a=0;
         for(int i=0;i<data2.size();i++)
        {
            a=a^data2[i];
        }
        *num2=a;

    }
    int judge(int index,int a)
    {
        a=a>>index;
        if((a&1)==1)//相同
            return 1;
        else
            return 0;
    }
};

收货总结:
1.位运算,还有异或运算的加一步熟练,
2.与1按位相与,其实就是取数的二进制的低位。

全部评论

相关推荐

06-22 10:41
赣东学院 Java
程序员小白条:?周六晚上投,这是什么操作,专门找996起步的吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务