当前位置: 首页 > 后端技术 > Java

算法回顾5——找出数组中只出现一次的两个数(异或的使用)

时间:2023-04-01 13:46:48 Java

思路:两个相同数的异或等于0假设数组中只有一个数只出现一次,则从头开始最后将数组中的所有数异或,最后的结果就是这个数。标题中的数组有两个只出现一次的数字。假设是a和b,我们还是对从头到尾的所有数进行异或,那么最后的结果就是a和b的异或结果。a和b的异或结果中至少有一位为1,将结果中第1位(从右往左数)的记录位置设为Index,表示a和b分别在对应的Index的bit为0和1。根据该bit的不同,将数组分为两组,分别进行AND运算得到a和b。代码如下:publicint[]FindNumsAppearOnce(int[]array){if(array==null)returnnull;int[]res=newint[]{0,0};//分别记录数组中的两个位置a和bintnumber=array[0];for(inti=1;i>1;//右移index++;}for(inti=0;i>index)&1)==0;//将该位设置为0所有AND,你得到一个只出现一次的数字;allAND如果该位为1,则获取另一个if(isZero)res[0]^=array[i];否则res[1]^=array[i];}returnres;}总结:当同一个数出现偶数次时,用XOR^消除此类数**。将一个数x右移m位,应该写成x=x>>m;而不仅仅是x>>m;