给出2n+1个数,其中有2n个数出现过两次,如何用最简便的方法找出里面只出现了一次的那个数。
例如这样一组数“3,3,100,2,4,2,5,5,4”,其中只有100出现了1次,其他都是出现了2次,如何找出其中的100?
最简便的方法是使用异或,代码如下:
1 public class Foo { 2 3 public static void main(String[] args) { 4 int[] arr = { 3, 3, 100, 2, 2, 4, 5, 5, 4 }; 5 int temp = 0; 6 for (int i = 0; i < arr.length; i++) { 7 temp ^= arr[i]; 8 } 9 System.out.println("只重复一次的数字是:" + temp); 10 // 运算效果同上 11 System.out.println("3^3^100^2^2^4^5^5^4=" 12 + (3 ^ 3 ^ 100 ^ 2 ^ 2 ^ 4 ^ 5 ^ 5 ^ 4)); 13 // 因为"a^b"和"b^a"结果一样,上边的表达式,和以下等效 14 System.out.println("2^2^3^3^4^4^5^5^100=" 15 + (2 ^ 2 ^ 3 ^ 3 ^ 4 ^ 4 ^ 5 ^ 5 ^ 100)); 16 } 17 }
运行结果:
只重复一次的数字是:100
3^3^100^2^2^4^5^5^4=100
2^2^3^3^4^4^5^5^100=100
算法的原理就是:任何数 异或 0值不变,任何数与自己异或值为0。
因此 一个数A 偶数次(2N次,2N>=2) 异或 同一个数B,结果值为A(例如:2^5^5^5^5=2,或 2^5^6^5^6=2)。