一个数组含有两个只出现一次的数,其余均出现两次,找出这两个数;
思路:先将这些书分成两组,每组都包含一个只出现一次的数;
如何分组:(1)将所有数异或,根据结果中第一个某一位为1的位置为n;(异或结果必然至少有一位为1)
(2)将第n位为1的数分为一组,第n位为0的数分为另一组。
import java.util.Scanner;
public class FindNumberAppearOnce {
static int num1 = 0;
static int num2 = 0;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] num = new int[n];
for (int i = 0; i < n; i++) {
num[i] = scan.nextInt();
}
findnumber(num);
System.out.println(num1+" "+num2);
}
public static void findnumber(int[] num) {
int temp = num[0];
for (int i = 1; i < num.length; i++) {
temp = temp ^ num[i];
}
System.out.println("temp="+temp);
int n = findfirstbit1(temp);
System.out.println("n="+n);
int j = 0;
int k = 0;
for (int i = 0; i < num.length; i++) {
if (((num[i] >> n) & 1) == 0) {
num1 = num1 ^ num[i];
} else {
num2 = num2 ^ num[i];
}
}
}
public static int findfirstbit1(int temp) {
int n = 0;
while (((temp & 1) == 0) && n < Integer.SIZE) {
temp = temp >> 1;
n++;
}
return n;
}
}