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

来源:互联网 发布:人工智能优缺点 编辑:程序博客网 时间:2024/06/12 22:18

题目:一个整形数组中出了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现了一次的数字,要求时间复杂度为O(n),空间复杂度为O(1)。

用异或知识解答,一个数异或本身结果为0,所以遍历整个数组,数组中所有数组相异或,相同数字相异或相抵消,结果为0,则最后结果为两个不同的数相异或的值。

保存最后所得值,以该值最后一位为标准,将数组分成两组,0一组,1一组,则两个不同的数字被分到不同组,再次将同一组数据相异或,则最后剩下数据为出现一次的数字。

bool IsBit(int num,int index){num>>=index;//右移return (num&1);}void FindNumApperOnce(vector <int> data,int *num1,int *num2){//给定一个数组,首先判断该数组是否为空;int temp=data[0];int size=data.size();if(size<2)return;for(int i=0;i<size;i++){temp^=data[i];//数组元素全部异或,最后temp为出现一次的数异或的结果;}int index=0;while((temp&1==0))//判断最后一位是否为0{index++;//&运算,全1为0,有0则0;} *num1=*num2=0;while (i<size){if(IsBit(data[i],index)){*num1^=data[i];}else{*num2^=data[i];}}}


原创粉丝点击