题目1:一个整型数组,一种数出现次数时奇数次,其余数均出现偶数次,找出其中出现奇数次的数。
题目2:一个整型数组,两种数出现次数时奇数次,其余数均出现偶数次,找出其中出现奇数次的数。
这两道题目可以运用位运算:
public static int t01(int arr[]){
int ele=0;
for(int a:arr){
ele^=a; //偶数次的异或结果为0,奇数次的异或0为本身,所以结果为所求
}
return ele;
}
public static void t02(int arr[]){
int ele1=0;
for(int e:arr){
ele1^=e; //结果为两个奇数(假设为a和b)次的异或
}
int right=ele1&(~ele1+1); //提取出最右边的1,即a和b不一样的位 将整体数组分为两类:以a和b的不同位来分
int ele2=0;
for(int e:arr){
if((right&e)==1){ //用不同位的该位为1(0也可以)的一组去异或上ele2 //注意要加括号
ele2^=e; //结果为a或b
}
}
System.out.println(ele2+" "+(ele1^ele2)); //用ele1异或上a或b结果即为另一个
}