截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
位运算解决
参考《494,位运算解只出现一次的数字》
我们看到异或结果最右边的1,也就是红色部分,根据这个位置是0还是1把原数组分为两组,那么13和17肯定不在同一组。那么每组就变成了只有一个数字出现一次,其他数字都出现两次。然后我们就可以使用《494,位运算解只出现一次的数字》的方式来解了。代码如下
public int[] singleNumber(int[] nums) {
int bitmask = 0;
//把数组中的所有元素全部都异或一遍
for (int num : nums) {
bitmask ^= num;
}
//因为异或运算的结果不一定都是2的n次幂,
//在二进制中可能会有多个1,为了方便计算
//我们只需保留其中的任何一个1,其他的都
//让他变为0,这里保留的是最右边的1
bitmask &= -bitmask;
int[] rets = {0, 0};
for (int num : nums) {
//然后再把数组分为两部分,每部分在
//分别异或
if ((num & bitmask) == 0) {
rets[0] ^= num;
} else {
rets[1] ^= num;
}
}
return rets;
}
上面的位运算bitmask &= -bitmask;表示的是把bitmask二进制中最右边的1保留,其他位置全部变为0,随便找个数据打印一下
再来看一下运算结果