题目描述
给定一个整数数组 nums
,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
样例
输入: [1,2,1,3,2,5]
输出: [3,5]
注意:
- 结果输出的顺序并不重要,对于上面的例子,
[5, 3]
也是正确答案。 - 你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
算法分析
位运算
LeetCode 136. 只出现一次的数字 此题的拓展
- 1、对所有数字进行异或处理,最后得到的一定是
a ^ b
,且a ^ b != 0
- 2、在
a ^ b
结果中,任意找到某位不相同的位置t
,可以通过该位区分出这两个数 - 3、再次通过枚举所有数,把第
t
位是0
的所有数(一定不包括b
)异或起来就会得到a
,把第t
位是1
的所有数(一定不包括a
)异或起来就会得到b
时间复杂度 $O(n)$
空间复杂度 $O(1)$
Java 代码
class Solution {
static int get(int[] nums, int k, int t)
{
int res = 0;
for(int c : nums)
{
if((c >> k & 1) == t)
res ^= c;
}
return res;
}
public int[] singleNumber(int[] nums) {
int ab = 0;
for(int c : nums) ab ^= c;
int k = 0;
while((ab >> k & 1) == 0) k ++;
return new int[]{get(nums, k, 0), get(nums, k, 1)};
}
}