1 一个整型数组里除了一个数字之外, 其他的数字都出现了两次. 请写程序找出这个只出现一次的数字.
思路: 0和两个相同的数字按位异或还是0. 0和一个数字按位异或得到该数字.
public int singleNumber(int[] array) {
int ret = 0;
for (int x : array) {
ret ^= x;
}
return ret;
}
2 一个整型数组里除了两个数字之外, 其他的数字都出现了两次. 请写程序找出这两个只出现一次的数字.
public int[] singleNumber2(int[] nums) {
int ret = 0;
for (int x : nums) {
ret ^= x;
}
// 2. 此时的异或结果相当于 a ^ b, 值一定不为 0. 就可以从中找到某个为 1 的 bit 位
int bit = 1;
int i = 0;
for (; i < 32; i++) {
if ((ret & (bit << i)) != 0) {
break;
}
}
// 循环结束之后, ret 中的值, 就是刚找到某一位为 1 的值
// 进行分组
int a = 0;
int b = 0;
for (int x : nums) {
if ((x & (bit << i)) != 0) {
// 第一组, 指定位为 1
a ^= x;
} else {
// 第二组, 指定位为 0
b ^= x;
}
}
int[] array = {a, b};
return array;
}