package Find;
/**
* @author 真他喵的学不动咯
* @create 2022-08-20--15:07
*/
public class fin { //找到数组中,出现了奇数次的数并打印
//不需要排序,直接异或,因为异或的结果和顺序无关
//目标需要寻找的也是次数,异或出来的就是剩下的那一个
//题目1:
//arr中,只有一种数出现奇数次
//偶数次的,异或出来都是0;最后只剩奇数次的那一次
public static void printOddTimesNum1(int[] arr){
int eor=0;
for (int i=0;i<arr.length;i++){
eor^=arr[i]; //eor=eor^arr[i],eor会随着i一直把数组中的数向后遍历,直到把数组中所有的数都遍历完
System.out.println(eor);
}
}
//题目2:
//arr中,只有两种数出现奇数次
//偶数次的,异或出来都是0;
public static void printOddTimesNum2(int[] arr){
/*
偶数次仍然不干扰,剩下的奇数次只有a,b
*/
int ero=0;
for (int i=0;i<arr.length;i++){
ero^=arr[i]; //找到了a、b
}
//此时的ero中必然有一个位置是1
//010101110
//000000010 rightOne
int rightOne=ero&(~ero+1); //提取出最右边的1
int onlyOne=0; //onlyOne ero'
for (int i=0;i<arr.length;i++){
// arr[1]=00001110101
// rightOne=00000010000
if ((arr[i]&rightOne)!=0){ //代表010100010处有1 ,把最右位是0还是1分开
onlyOne^=arr[i];
}
}
System.out.println(onlyOne+" "+(ero^onlyOne)); //onlyOne是a,ero^onlyOne是b
}
}
//找到数组中,出现了奇数次的数并打印
最新推荐文章于 2024-05-31 10:46:10 发布