260. Single Number III
题目描述和难度
- 题目描述:
给定一个整数数组 nums
,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :
输入:[1,2,1,3,2,5]
输出:[3,5]
注意:
- 结果输出的顺序并不重要,对于上面的例子,
[5, 3]
也是正确答案。 - 你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
- 题目难度:中等。
- 英文网址:260. Single Number III 。
- 中文网址:260. 只出现一次的数字 III 。
思路分析
求解关键:
参考解答
参考解答1
public class Solution {
public int[] singleNumber(int[] nums) {
int a_xor_b = 0;
for (int num : nums) {
a_xor_b ^= num;
}
// n&(n-1) 将从右边到左边的第 1 个 1 变成 0
// n&(~(n-1)) 只保留从右边到左边的第 1 个 1
int mask = a_xor_b & (~(a_xor_b - 1));
int[] res = new int[2];
for (int num : nums) {
if ((num & mask) == 0) {
res[0] ^= num;
} else {
res[1] ^= num;
}
}
return res;
}
}
参考解答2
public class Solution2 {
public int[] singleNumber(int[] nums) {
int xor = 0;
for (int num : nums) {
xor ^= num;
}
int[] res = new int[2];
int mask = 1;
for (int i = 0; i < 32; i++) {
if ((xor & mask) != 0) {
break;
}
mask <<= 1;
}
for (int num : nums) {
if ((num & mask) == 0) {
res[0] ^= num;
} else {
res[1] ^= num;
}
}
return res;
}
}
本篇文章的地址为 https://liweiwei1419.github.io/leetcode-solution/leetcode-0260-single-number-iii ,如果我的题解有错误,或者您有更好的解法,欢迎您告诉我 liweiwei1419@gmail.com 。