1 public class singleThree { 2 /* 3 * 如有数组A[]={2,2,3,2} 4 * 其二进制为 5 * 0 0 1 0 :2 6 * 0 0 1 0 :2 7 * 0 0 1 1 :3 8 * 0 0 1 0 :2 9 * 相加起来为 10 * 0 0 4 1 每一位除以3为 11 * 0 0 1 1 结果为3 12 * 当一个数和1进行与运算的时候只取最后一位 13 * 如0 0 1 1 & 0 0 0 1 结果为0 0 0 1 14 * 15 * 如上数组,应该先取数组各数据的最后一个二进制数相加 16 * 1.应该把最后一位数相加,第一次应该向右移动0位,相加后为1; 17 * result的结果为(w%3)<<(i-1)结果也是为1,从第0位得到的数据为整数,向左移动的位数 18 * 其实是计算二进制指定位数的数值,也就是从二进制转换为10进制 19 * 2.数组的各数据应计算第二位的二进制数,应该把数组的二进制数向右再移动一位,与1进行与运算得到结果为4 20 * result=(w%3)<<(i-1),为第二位二进制数的结果,应该和第一位的结果加起来 21 * 22 * 23 * */ 24 public int find(int A[]) 25 { 26 int bits = 4*8; 27 int result=0; 28 for(int i=1; i<=bits; i++) 29 { 30 int w=0; 31 int t=1; 32 33 for(int j=0; j<A.length; j++) 34 w += (A[j]>>(i-1))&t; 35 result+= (w%3)<<(i-1); //若是除过一个数之外,其他数重复k次,则将此处的3改为k 36 } 37 return result; 38 } 39 40 41 public static void main(String[] args) { 42 // TODO Auto-generated method stub 43 int A[]={2,2,3,2}; 44 singleThree st = new singleThree(); 45 int num=st.find(A); 46 System.out.println(num); 47 48 } 49 50 }