题目
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
解题思路
这题较难,首先这里如果只是计算一个不重复的很简单,所有的数字进行异或即可,最后的异或答案即是不重复的一个, 但是这里是需要两个不重复的,重点就是如何分组, 将两个不重复的放置再不同的组里, 然后再分别异或组里的所有值即可出现2个不重复的答案, 首想想到的就是二进制0,1去分组,这里如果先对所有的值异或,那么其实最后的值就是2个不重复的异或结果,那么其结果的二进制里面必定是含有有1, 我们只要找到异或结果中第一位含有1的这个值m,这个1表示2个重复值必定在这一位是0或1, 可以借此分组,然后将这个求出来的m对所有数组中的值去做与操作, 只要为0的就是一组,为非0的就是另一组, 备注这里是非0, 不一定是1, 可能更大, 看m取值在哪里, 但是必定是有0这个结果的, 这里直接使用0去判断即可, 代码实现如下。
Java代码实现
public class SingleNumbers {
public int[] singleNumbers(int[] nums) {
int res = 0 ;
for (int i : nums) {
res = res ^ i;
}
int m = 1;
while((res & m) == 0){
m = m << 1;
}
int x = 0;
int y = 0;
for (int z : nums) {
if((z & m) == 0){
x = x ^ z;
}else{
y = y ^ z;
}
}
return new int[]{x, y};
}
}