Given a **non-empty** array of integers, every element appears *three* times except for one, which appears exactly once. Find that single one.

**Note:**

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

**Example 1:**

Input:[2,2,3,2]Output:3

**Example 2:**

Input:[0,1,0,1,0,1,99]Output:99

**Solution 1:**

We will use a HashMap and store the count of each number, and we will parse through the map and return the key with value 1. This approach will take O(N) time complexity and O(N) space for the Map.

```
class HackerHeap {
public int singleNumber(int[] nums) {
Map<Integer, Integer> count = new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
count.put(nums[i],count.getOrDefault(nums[i],0)+1);
}
for(Integer key:count.keySet()){
if(count.get(key) == 1) return key;
}
return -1;
}
}
```

**Solution 2:**

We will use Bitwise operators to find the non repeating number, this approach will take O(N) time complexity but constant space as we are not taking any extra space to store the count like above.

```
class HackerHeap {
public int singleNumber(int[] nums) {
int ones = 0, twos = 0, threes = 0;
for (int i = 0; i < nums.length; i++) {
twos |= ones & nums[i];
ones ^= nums[i];
threes = ones & twos;
ones &= ~threes;
twos &= ~threes;
}
return ones;
}
}
```