剑指offer | 数组中只出现一次的数字
2019-07-31 本文已影响0人
icebreakeros
数组中只出现一次的数字
一个整型数组里除了两个数字之外,其他的数字都出现两次
示例
输入:{2, 4, 3, 6, 2, 4, 5, 5}
输出:3 6
思路:一个数异或自己本身为0,根据异或的性质,首先对数组中所有数字进行异或操作,得到两个只出现一次的数字异或后的值,根据该值的二进制表示得到最右为1的index值,然后根据index是否为1将数组分为两类,然后得到每一类中只出现一次的数字
public class NumbersAppearOnce {
public void find(int[] numbers) {
if (Optional.ofNullable(numbers).isEmpty()) {
throw new RuntimeException("invalid parameters");
}
int number = 0;
for (int i = 0; i < numbers.length; i++) {
number ^= numbers[i];
}
int m = 0;
int n = 0;
int index = getIndex(number);
for (int i = 0; i < numbers.length; i++) {
if (check(numbers[i], index)) {
m ^= numbers[i];
} else {
n ^= numbers[i];
}
}
System.out.println("m = " + m + ", n = " + n);
}
// number二进制表示中最右边1的index
private int getIndex(int number) {
int index = 0;
while ((number & 1) == 0) {
number = number >> 1;
index++;
}
return index;
}
// 判断number二进制表示中从右边数起的index位是不是1
private boolean check(int number, int index) {
number = number >> index;
return (number & 1) == 1;
}
}