剑指offer:数组中只出现一次的数字

首先判断数组的长度,小于2就返回;将整个数组进行异或处理,相同为0,不同为1,最后剩只出现一次的数。定义了一个标志位sign,找到totalNum第一个为1的位,将数组data分成两部分,一部分为1的位,另一部分为0的位,基于此,将整个数组在遍历一遍。把数组中第sign为0的数异或,结果放到num1中,在把数组中第sign为1的数异或,结果放到num2中,最后输出!!!

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
       if(data.size()<2) return ;
       int tolalNum = 0;
       for(int i=0;i<data.size();i++){
        tolalNum^= data[i];
       } 
       int sign = 0;
       for(;sign<data.size();sign++){
        if((tolalNum&(1<<sign))!=0){
            break;
        }

       }
       cout<<sign<<endl;
       num1[0]=0;
       num2[0]=0;
       for(int i=0;i<data.size();i++){
        if((data[i]&(1<<sign))==0){
            num1[0]^=data[i];
            cout<<"0"<<data[i]<<" "<<(1<<sign)<<endl;

        }
        else{
            num2[0]^=data[i];
            cout<<"1"<<data[i]<<" "<<(1<<sign)<<endl;
        }
       }
       cout<<num1[0]<<num2[0]<<endl;

    }
};

#剑指offer##23届找工作求助阵地#
全部评论

相关推荐

05-07 13:29
已编辑
门头沟学院 Java
北斗导航Compass低仿版:能不能先搞清楚优先级啊,怎么可能是项目问题,项目很重要吗?又没学历 又没实习大厂凭啥约面?那玩具项目 没应用在真实生产环境下的 就算做上天又有什么用?早点找个小公司实习 拿小公司实习去投大厂实习,这才是你现在该做的
投递美团等公司10个岗位 简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务