求数组中的唯一的数字?

题目:给定一个非空的整数数组,除了某个元素进出现一次以外,其他元素均出现2次,请找出哪个只出现一次的元素?

说明: 算法应具有线性时间复杂度,可以不使用额外的空间来实现吗?

题目考察的知识点异或运算, 其中异或运算满足如下定理

1、异或运算满足结合律 即 a(bc) = (ab)c
2、异或运算满足交换律 即 a^b = b ^a
3、任意数与自身异,均是0 即 a^a = 0
4、任意一个数与0异或,均是其本身 即a ^ 0 = a

测一测是否理解了?👇🏻
临时插入题目:不用新的变量,完成两个数的交换?

    int a = 2;
    int b = 3;

    System.out.println("a的值是:" + a  + "\t b的值是: " + b);

    a = a ^ b;

    b = a ^ b;

    a = a ^ b;

    System.out.println("a的值是:" + a  + "\t b的值是: " + b);

    /*
    * 解析:
    * 第二行中 b = a ^ b 将第一行中的a = a ^ b代入 即
    *
    * b = (a ^ b) ^ b  ==> a ^ b ^ b ==> a ^ (b ^ b) = a ^ 0 = a;
    *
    * 所以说此时 b = a
    *
    * 第三行中 a = a ^ b 同理做运算,将第二行中的代入
    * a = a ^ b = a ^ (a ^ b) = b;
    *
    * 此时 a = b;

题目的代码解答如下:


        int[] arr = {1,2,2,3,3,4,4};

        //方法一:采用异或运算的形式去解决
        //因为a^a = 0 且 a^0 = a, 在通过交换律,这样最后只会剩下最后一个单个的数

        int result = 0;

        for(int i: arr) {
            result = result ^ i;
        }

        System.out.println("唯一的数是:" + result);

运行结果:


结果.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容