剑指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届找工作求助阵地#