数组中一个或两个数字不同

1 一个整型数组里除了一个数字之外, 其他的数字都出现了两次. 请写程序找出这个只出现一次的数字.

思路: 0和两个相同的数字按位异或还是0. 0和一个数字按位异或得到该数字.

	public int singleNumber(int[] array) {
        int ret = 0;
        for (int x : array) {
            ret ^= x;
        }
        return ret;
    }

2 一个整型数组里除了两个数字之外, 其他的数字都出现了两次. 请写程序找出这两个只出现一次的数字.

	public int[] singleNumber2(int[] nums) {
        int ret = 0;
        for (int x : nums) {
            ret ^= x;
        }
        // 2. 此时的异或结果相当于 a ^ b, 值一定不为 0. 就可以从中找到某个为 1 的 bit 位
        int bit = 1;
        int i = 0;
        for (; i < 32; i++) {
            if ((ret & (bit << i)) != 0) {
                break;
            }
        }
        // 循环结束之后, ret 中的值, 就是刚找到某一位为 1 的值
        // 进行分组
        int a = 0;
        int b = 0;
        for (int x : nums) {
            if ((x & (bit << i)) != 0) {
                // 第一组, 指定位为 1
                a ^= x;
            } else {
                // 第二组, 指定位为 0
                b ^= x;
            }
        }
        int[] array = {a, b};
        return array;
    }

版权声明:本文为dangkun321原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。