剑指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届找工作求助阵地#
查看1道真题和解析
