Given an array of numbers, only one number appears once, others twice. Find the number.

If there's only 1 number appearing once, it's actually easier. just use xor. The duplicate values cancel out since their xor is 0

``````int unique_number(const vector<int>& a) {
int ans(0);
for (size_t i=0; i < a.size(); i++)
ans ^= a[i];
return ans;
}``````

Let the number which occurs only once in the array be `x`

``````x <- a
for i <- 2 to n
x <- x ^ a[i]
return x
``````

Since `a ^ a = 0` and `a ^ 0 = a`

Numbers which occur in pair cancel out and the result gets stored in `x`

Working code in C++

``````#include <iostream>

template<typename T, size_t N>
size_t size(T(&a)[N])
{
return N;
}
int main()
{
int a [] = {1,2,3,4,3,1,2};
int x = a;
for (size_t i = 1; i< size(a) ; ++i)
{
x = x ^ a[i];
}
std::cout << x;
} ``````

What if two numbers appear once, what if 500 numbers appear once. How to find these numbers.?

I think hashes are definitely needed. Thus you find all numbers appeared once in O(n) time. Some quick example below (in Ruby):

``````def find_single(ar)
num_hash = Hash.new(2)
ar.each do |n|
num_hash[n] -= 1
num_hash.delete(n) if num_hash[n] <= 0
end

return num_hash.keys
end``````

http://www.sysexpand.com/?path=exercises/number-appearing-once-in-array

END