//一个数组中有一个数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这个数
// 要知道 N ^ N = 0 所以将全部的数异或起来 就是那个出现奇数次的数
public static void printOddTimesNum1(int []arr){
int eor = 0;
for(int i = 0;i<arr.length;i++){
eor ^= arr[i];
}
System.out.println(eor);
}
//一个数组中有两个数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数
public static void printOddTimesNum2(int[] arr){
int eor = 0;
for(int i = 0;i<arr.length;i++){
eor ^= arr[i];
}
// eor = a ^ b
// eor != 0 因为是两个不同的数
// eor 必然有一个位置上是1
int rightOne = eor & (~eor + 1); //提取出最右的1 //给定一个int类型的数 提取出最右侧的 1 来 这里说明, 只有一个数在这一位是1 另一位是0
int onlyOne = 0; //eor'
for(int i = 0;i<arr.length;i++){
if((arr[i] & rightOne) != 0) //这里只有 a 或 b 其中一个数会进到下面的语句 那么就类似在数组中找一个出现了奇数次的数 把rightOne位上是1的数全部提取出来
onlyOne ^= arr[i];
}
System.out.println(onlyOne + " "+ (eor ^ onlyOne));
}
public static int bit1Count(int N){
int count = 0;
while(N != 0){
int rightOne = N & ((~N) + 1);
count++;
N ^= rightOne;
//N -= rightOne; 是负数就凉凉了
}
return count;
}
//给定一个int类型的数 提取出最右侧的 1 来
//举例: N = 001001001010000
//结果:ANSER= 000000000010000
//分析: N 001001001010000
// ~N 110110110101111
// ~N+1 110110110110000
//结果 N & (~N+1) 000000000010000 提取到最右侧的1
// int rightOne = eor & (~eor + 1); //提取出最右的1
public static void main(String[] args) {
int[] arr = {1,2,2,2,2,3,3,4};
printOddTimesNum2(arr);
}
异或练习
最新推荐文章于 2024-03-13 10:55:46 发布