有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数

给出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)。

参考文章http://blog.csdn.net/zhengzhb/article/details/7289325

posted @ 2013-08-08 00:11  Agrimony  阅读(383)  评论(0编辑  收藏  举报