LeetCode 260. 只出现一次的数字 III
Posted 数据结构和算法
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 260. 只出现一次的数字 III相关的知识,希望对你有一定的参考价值。
想看更多算法题,可以扫描上方二维码关注我微信公众号“数据结构和算法”,截止到目前我已经在公众号中更新了500多道算法题,其中部分已经整理成了pdf文档,截止到目前总共有1000多页(并且还会不断的增加),可以在公众号中回复关键字“pdf”即可下载。
位运算解决
参考《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,随便找个数据打印一下
再来看一下运算结果
以上是关于LeetCode 260. 只出现一次的数字 III的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode Java刷题笔记—260. 只出现一次的数字 III