题目
一个整形数组里,除了两个数字之外,其他的数字都出现了两次,找出这两个只出现一次的数字,例如数组{1,3,5,7,1,3,5,9},找出7和9。
理解
之前做过一个数组中只有一个只出现一次的数字,用亦或的方法,同理,找两个数字,先把所有数字亦或,最后的结果是两个只出现一次的数亦或的结果,这个结果中,出现1的位置说明两个元素当前位不相等,可以根据1出现的位置把当前数组分为两个子数组,每个子数组中只有一个出现一次的数字,其余元素都是两两出现,然后对每个字数组单独亦或,求出两个单独的数。
代码
public class lianxi {
public static void fin(int []a) {
int x=0;
int pos=0;
int s1=0;
int s2=0;
for(int i=0;i<a.length;i++){
x^=a[i];//两个出现一次的数亦或的结果
}
for(int i=0;i<32;i++){
if(((x>>i)^1)==0)
{
pos=i;//找出亦或结果中第一次出现1的位置,根据pos上的数字的不同,可分为两个子数组
break;
}
}
for(int i=0;i<a.length;i++){
if(((a[i]>>pos)&1)==0){
s1^=a[i];
}
else
s2^=a[i];
}
System.out.println(s1+" "+s2);
}
public static void main(String[]args){
int []a={1,3,5,7,1,3,5,9};
fin(a);
}
}