import java.util.*;
/**
* Given an array of integers, every element appears twice except for one. Find
* that single one.
*
* Note:
* Your algorithm should have a linear runtime complexity. Could you implement
* it without using extra memory?
*
* Tags: Hashtable, Bit Manipulation
*/
class SingleNum {
public static void main(String[] args) {
int[] A = {1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7};
System.out.println(singleNum(A));
System.out.println(singleNumNoSpace(A));
}
/**
* Without extra space
* XOR of two equal numbers is 0 : a^a=0. This is the main idea of the
* algorithm.
*/
public static int singleNumNoSpace(int[] A) {
int res = 0;
for (int i = 0; i < A.length; i++) res ^= A[i];
return res;
}
/**
* hashtable, store the value and remove when appears second time
* the only number left is the one
*/
public static int singleNum(int[] A) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < A.length; i++) {
if (!map.containsKey(A[i])) map.put(A[i], 1);
else map.remove(A[i]);
}
int res = 0;
for (Integer key : map.keySet()) res = key;
return res;
}
}