/**
* 一个无序数组里有若干个整数,只有2个整数出现了奇数次,如何找到这2个出现奇数次的整数
* 解法:把2个出现奇数次的数命名为A和B,那么遍历整个数字进行异或,那么最终的异或
* 结果就是A和B的异或结果。在这个结果中,至少有一位会是1(如果都是0,则说明A和B相同
* ,则和题目不符)。
* 假设A和B中位为1的是第三位。则可以判断A和B中,有一个第三位为1,另一个第三位为0
* 然后以一个数二进制第三位是不是1来将整个数组分为2类,则A和B肯定在不同的类中
* 再对两个数组进行异或操作,分别得到两个出现奇数次的A和B。
*/
public class FindLostNum {
public static int[] findLostNum(int[] array){
int length=array.length;
int xorNum=0;
for(int i=0;i<length;i++){
xorNum=xorNum^array[i];
}
if(xorNum==0)
return null;
int oneflag=1;
while ((xorNum&oneflag)==0){
oneflag=oneflag<<1;
}
int[] result=new int[2];
for(int i=0;i<length;i++){
if((array[i]&oneflag)==0) {
result[0]=result[0]^array[i];
}
else{
result[1]=result[1]^array[i];
}
}
return result;
}
public static void main(String[] args) {
int[] array={4,1,2,2,1,3,5,4};
int[] result=findLostNum(array);
System.out.println(result[0]+" "+result[1]);
}
}
在无序数组中寻找两个出现奇数次的数
最新推荐文章于 2022-04-16 17:36:48 发布