题解 | #数组中只出现一次的数字#

数组中只出现一次的数字

http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811

hash思路
map<int, int>用于记录元素和元素出现的次数
最后过滤出出现一次的两个元素

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        int * arr[2] = {num1, num2};
        map<int, int> m;
        for(int i=0; i<data.size(); ++i)
            m[data[i]]++;
        int j = 0;
        for(map<int, int>::iterator it=m.begin(); it!=m.end(); ++it)
            if(it->second == 1)
                *arr[j++] = it->first;
    }
};

位运算

求出所有元素异或的值
拿出最右的1bit位
让所有与上一步的1bit位都是1元素的异或在一起,就得到其中一个数
然后这个数异或一下所有异或在一起的元素值就得到第二个数

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {

        int xor_ = 0;
        for(int i=0; i<data.size(); ++i)
            xor_ ^= data[i];

        //求xor最右边的1bit位
        int right_1 = xor_&(~xor_+1);
        *num1 = 0;
        for(int i=0; i<data.size(); ++i){
            if(data[i]&right_1)
                *num1 ^= data[i];
        }
        *num2 = xor_^ *num1;
    }
};
全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务