落单的数 III
题目
给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。
样例
给出 [1,2,2,3,4,4,5,3],返回 1和5
挑战
O(n)时间复杂度,O(1)的额外空间复杂度
题解
先对数组进行整体亦或,结果就是两个不同的数的亦或。再找到该数第一个为1的位,则该位就是两数的不同点,利用该位将数组分为两部分再次亦或,可得到结果。
public class Solution {
/**
* @param A : An integer array
* @return : Two integers
*/
public List<Integer> singleNumberIII(int[] A) {
int xor = 0;
for (int i = 0; i < A.length; i++)
{
xor ^= A[i];
}
int lastBit = xor - (xor & (xor - 1));
int group0 = 0, group1 = 0;
for (int i = 0; i < A.length; i++)
{
if ((lastBit & A[i]) == 0)
{
group0 ^= A[i];
}
else
{
group1 ^= A[i];
}
}
ArrayList<Integer> result = new ArrayList<Integer>();
result.add(group0);
result.add(group1);
return result;
}
}
Last Update 2016.10.5