找出数组中只出现1次的数,其余数均出现2次,扩展,其余数出现2次以上
参考回答:
位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身。当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消了。
public static int find1From2(int[] a){ int len = a.length, res = 0; for(int i = 0; i < len; i++){ res = res ^ a[i]; } return res; }
扩展:
public static int find1From3(int[] a){ int[] bits = new int[32]; int len = a.length; for(int i = 0; i < len; i++){ for(int j = 0; j < 32; j++){ bits[j] = bits[j] + ( (a[i]>>>j) & 1); } } int res = 0; for(int i = 0; i < 32; i++){ if(bits[i] % 3 !=0){ res = res | (1 << i); } } return res; }