剑指offce之数组中只出现一次的数字

来源:互联网 发布:c语言编程软件win10 编辑:程序博客网 时间:2024/05/21 12:44
时间限制:1秒 空间限制:32768K 热度指数:86788
本题知识点: 数组

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
题解:(废话:开始我自己用的是暴力求解,后面看到别人用位运算感觉差距好大;这里主要分享下位运算思路,也帮助自己更好的学习和理解吧)从题目看给出了两个重要信息,其余数字都出现两次(进行异或运算都会抵消),只剩下这两个出现一次的数字。然后根据异或结果,寻找第一个1所在的位置(这里说明有个数的二进制在这里为1,一个在这为0),就可以进行分边了。
代码:
class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        int len=data.size();
        int temp=data[0];
        for(int i=1;i<len;++i)
            temp^=data[i];//与运算
        if(temp==0)
            return;
        int index=0;
        while((temp&1)==0)//找寻第一个1所在的位置
        {
            temp=temp>>1;
            index++;
        }
        *num1=*num2=0;
        for(int i=0;i<len;++i)
        {
            if(isbit(data[i],index))
                *num1^=data[i];
            else
                *num2^=data[i];
        }
    }
    bool isbit(int temp,int index)
    {
        temp=temp>>index;
        return temp&1;
    }
};
原创粉丝点击