只出现一次的数字(位运算算法)
目录
一:题目链接
二:题目思路
三:代码实现
一:题目链接
二:题目思路
首先,我们可以通过将数组的元素一直 按位异或(^) 操作,就可以得到那两个只出现一次数字的 按位异或(^) 后的值 ret 。
之后,我们就要将这两个数字分离开来,怎么做呢?因为 ret & ( - ret) 得到 ret 二进制最低位出现的数字 1,再因为两个数字 按位异或 后不同的二进制位是 1 ,以这个为突破点,我们就可以继续操作。先看代码实现再解释后面:
三:代码实现
int ret = 0;for(int x : nums) {ret ^= x;}int k = ret & (-ret);int a = 0;int b = 0;for(int x : nums) {if((x & k) != 0) {a ^= x;}else {b ^= x;}} return new int[]{a,b};
再定义 两个变量 a, b,再遍历一遍数组,因为数组其他元素都会出现两次。所以其中相同的元素会两次进入 a ^= x 或两次进入 b ^= x,无影响。再结合上面所说的两个数字 按位异或 后不同的二进制位是 1 ,以这个为突破点分离两个只出现一次的数字。