落单的数III(Java)
题目
给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。
输入:
[1,2,2,3,4,4,5,3]
输出:
1 5
思路:
首先将所有数字求异或,得到的数是两个落单的数字的异或。由于这两个数字肯定不同,则他们的异或一定有值1的位。找到第一个值为1的位,以这一位为标志,将数组中的数分为两组。一组是该位为1的数字,一组是该位为0的数字。对这两组数分别进行异或,即可找到这两个不同的数字。
Java代码
public class Solution {
/**
* @param A : An integer array
* @return : Two integers
*/
public List<Integer> singleNumberIII(int[] A) {
// write your code here
if( A == null || A.length == 0)
return null;
List<Integer> res = new ArrayList<Integer>();
int n = A.length;
int tmp = A[0];
for(int i = 1; i < A.length; i++){
tmp = tmp ^ A[i];
}
int k = findFirstBit(tmp);
boolean mark1 = true;
boolean mark2 = true;
int res1 = 0;
int res2 = 0;
for(int i = 0; i < n; i++){
if((A[i]>>k & 1 )== 0){
if(mark1){
res1 = A[i];
mark1 = false;
}
else
res1 = res1 ^ A[i];
}
else{
if(mark2){
res2 = A[i];
mark2 = false;
}
else
res2 = res2 ^ A[i];
}
}
res.add(res1);
res.add(res2);
return res;
}
public int findFirstBit(int tmp){
int res = 0;
while((tmp & 1) == 0){
tmp = tmp>>1;
res ++;
}
return res;
}
}