题目描述:两种数出现奇数次 其他数出现偶数次 求这两个数
解决思路
两个数异或后的数a^b=eor一定不为0 找到eor数位的最右边的1,将一个数eor’把它最右边的数设为1其他为设为0 那么用eor’(就是新设置一个数只有最右边位置上的数为1)来和数组中的数相与虽然有偶数但是偶数的次数会相互抵消 只剩下a和b其中一个然后再用eor异或a或者b都可以得到另外一个。
代码如下

import java.util.Scanner;

public class code06 {
/*
题目描述: 两种数出现奇数次 其他数出现偶数次 求这两个数
0^n=n n^n=0
两个数 怎么办
思路:
两个数异或后的数a^b=eor一定不为0 找到eor的最右边的1
将一个数eor'把它最右边的数设为1其他为设为0 那么用eor'来和数组中的数相与
虽然有偶数但是偶数的次数会相互抵消 只剩下a和b其中一个
然后再用eor异或a或者b都可以得到另外一个
* */
public static void printOddTimesNum2(int[] arr) {
int eor = 0;
for (int i = 0; i < arr.length; i++) {
eor ^= arr[i];
}
// a 和 b是两种数
// eor != 0
// eor最右侧的1,提取出来
// eor : 00110010110111000
// rightOne :00000000000001000
int rightOne = eor & (-eor); // 提取出最右的1

int onlyOne = 0; // eor'
for (int i = 0 ; i < arr.length;i++) {
// arr[1] = 111100011110000
// rightOne= 000000000010000
if ((arr[i] & rightOne) != 0) {
onlyOne ^= arr[i];
}
}
//异或后的onlyone则必定会a或者b其中一个
System.out.println(onlyOne + " " + (eor ^ onlyOne));
}
public static void main(String[] args) {
System.out.println("请输入:");
Scanner sc = new Scanner(System.in);
String str=sc.nextLine().toString();
//数字之间用空格隔开
String[] arr=str.split(" ");
int[] b=new int[arr.length];
//输出
for (int j=0;j<b.length;j++){
b[j]=Integer.parseInt(arr[j]);
// System.out.println(b[j]);
}
printOddTimesNum2(b);
}
}

新创建一个公众号 Rockey小何同学 想相互交流的同学可以关注一下哈! 感谢支持!