0
点赞
收藏
分享

微信扫一扫

LeetCode 260. 只出现一次的数字 III

截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载

LeetCode 260. 只出现一次的数字 III_数据



位运算解决

参考​​《494,位运算解只出现一次的数字》​​​LeetCode 260. 只出现一次的数字 III_位运算_02
LeetCode 260. 只出现一次的数字 III_数据_03
我们看到异或结果最右边的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,随便找个数据打印一下

LeetCode 260. 只出现一次的数字 III_LeetCode_04

再来看一下运算结果

LeetCode 260. 只出现一次的数字 III_位运算_05


举报

相关推荐

0 条评论