/* * 137. Single Number II * 2016-5-22 by Mingyang * 这道题目就是我的思路,你想啊,每一个数都用二进制来表示,每一个位上面的1的个数之和应该是3的整数倍 * 如果不是的话,那么那位就是多的1,所以我们用1来&就可以知道所有第一位上的情况,然后1要移动变为10,也可以将 * 要检查的数字移动,往右边移动一位,这样第二位也就移动到第一位来了,同时相应的数组也记数 * 这样我们在后面得到了一个数组包含了很多1的数量在上面,最后我们再把每一位模3以后还原,加到res上面 */ public int singleNumber1(int[] A) { if(A.length == 0||A==null) return 0; int[] cnt = new int[32]; for(int i = 0; i < A.length; i++){ for(int j = 0; j < 32; j++){ if( (A[i]>>j & 1) ==1){ cnt[j]++; } } } int res = 0; for(int i = 0; i < 32; i++){ res += (cnt[i]%3 << i); //res |= (cnt[i]%3 << i); } cnt = null; return res; }