Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
===================
Analysis:
Known that it need to be used bit level approach, while I am really not that familiar with. Here is a blog written by a master, who clearly demonstrated the bit solution of this problem:
http://blog.csdn.net/morewindows/article/details/12684497
Basic approach is that
1. Store the number of appearances of each bit (total bit in int is 32) in the whole array.
2. Format each bit of the result int by comparing if the number of appearances of specific bit %3 != 0.
public class Solution {
public int singleNumber(int[] A) {
if(A.length == 0) return 0;
// store sum of each bit for the whole array (from low bit to hight bit)
int[] bitSum = new int[32];
for(int i=0; i<32; i++){
for(int j=0; j<A.length; j++){
bitSum[i] += (A[j]>>i)&1;
}
}
// construct the result number according to the sum array
int result = 0;
for(int i=0; i<32; i++){
if (bitSum[i]%3 == 1){
result += 1<<i;
}
}
return result;
}
}