The key is to use two constant space(32 bits) to store how many times 1 or 0 showed up in the bit i. If times of 1 in bit i is not the multiple of 3, then the unique value's bit i is 1. Otherwise the unique value's bit i is 0.
Actually this algorithm can be extended to three times, four times, five times etc..
import java.util.*; public class Solution { public int singleNumber(int[] A) { int[] zero = new int[32]; int[] one = new int[32]; for(int i=0;i<A.length;i++) { for(int j=0;j<32;j++) { if( ((1<<j) & A[i]) != 0 ) { one[j]++; } else { zero[j]++; } } } int ans = 0; for(int k=0;k<32;k++) { if(one[k] % 3 !=0 ) { ans = (ans | (1<<k)); } } return ans; } public static void main(String[] args) { int[] A = {-1,5,5,5}; Solution sol = new Solution(); System.out.println(sol.singleNumber(A)); } }