Given an array of numbers nums
, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.
For example:
Given nums = [1, 2, 1, 3, 2, 5]
, return [3, 5]
.
Note:
- The order of the result is not important. So in the above example,
[5, 3]
is also correct. - Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?
题目链接:https://leetcode.com/problems/single-number-iii/
题目分析:将全部数字相与得到xorSum,由于异或运算的性质,xorSum中为1的位肯定只来自某一个数字,因此可以用那些位来区分,方便起见直接取xorSum的lowbit位,只要与lowbit位相与不为0的全部异或在一起,因为其他数字都出现了两次,异或的结果都是0,而所要求的另一个数字与之相与肯定是0,所以通过这样的异或操作可以唯一确定一个数字,同理另一个数字直接将与lowbit位相与为0的都异或起来即可
public class Solution {
public int[] singleNumber(int[] nums) {
int xorSum = 0, len = nums.length;
for (int i = 0; i < len; i ++) {
xorSum ^= nums[i];
}
int lowBit = xorSum & (-xorSum);
int[] ans = new int[2];
ans[0] = 0;
ans[1] = 0;
for (int i = 0; i < len; i ++) {
if((nums[i] & lowBit) != 0) {
ans[0] ^= nums[i];
}
else {
ans[1] ^= nums[i];
}
}
return ans;
}
}