异或算法
问题
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。如输入: [4,1,2,1,2],输出:4←
代码
public class C {
public static void main(String[] args) {
int[] a = {4,1,2,1,2};
int ii = num(a);
System.out.println(ii);
}
public static int num(int[] a) {
int n=0;
for(int i=0;i<a.length;i++) {
n=n^a[i];
}
return n;
}
}
二进制转换:
4: 0100 1: 0001 2: 0010 1: 0001 2: 0010
循环开始:第一次:4: 0100 ^ 1: 0001 = 0001-0100 = 0101:5=n
第二次:5: 0101 ^ 2: 0010 = 0010-0101 = 0111:7=n
第三次: 7: 0111 ^ 1: 0001 = 0001-0111 = 0110:5=n
第四次: 5: 0110 ^ 2: 0010 = 0010-0110 = 0100:4=n
总结
网上有些人说异步算法对两个数进行比较相同返回0不相同返回1,算法还是先将数值转换为二进制然后用后边的数减去前边的的数,最后得到的二进制数就是数组里唯一的那个数。
注意
使用异或算法在对数组进行运算时,数组中只能有一个元素个数为奇数,其他的都为偶数,否则运算的结果会受到影响