剑指offer | 数组中只出现一次的数字

数组中只出现一次的数字

一个整型数组里除了两个数字之外,其他的数字都出现两次

示例
输入:{2, 4, 3, 6, 2, 4, 5, 5}
输出:3 6

思路:一个数异或自己本身为0,根据异或的性质,首先对数组中所有数字进行异或操作,得到两个只出现一次的数字异或后的值,根据该值的二进制表示得到最右为1的index值,然后根据index是否为1将数组分为两类,然后得到每一类中只出现一次的数字

public class NumbersAppearOnce {

    public void find(int[] numbers) {
        if (Optional.ofNullable(numbers).isEmpty()) {
            throw new RuntimeException("invalid parameters");
        }

        int number = 0;
        for (int i = 0; i < numbers.length; i++) {
            number ^= numbers[i];
        }

        int m = 0;
        int n = 0;
        int index = getIndex(number);
        for (int i = 0; i < numbers.length; i++) {
            if (check(numbers[i], index)) {
                m ^= numbers[i];
            } else {
                n ^= numbers[i];
            }
        }
        System.out.println("m = " + m + ", n = " + n);
    }

    // number二进制表示中最右边1的index
    private int getIndex(int number) {
        int index = 0;
        while ((number & 1) == 0) {
            number = number >> 1;
            index++;
        }
        return index;
    }

    // 判断number二进制表示中从右边数起的index位是不是1
    private boolean check(int number, int index) {
        number = number >> index;
        return (number & 1) == 1;
    }
}

你可能感兴趣的:(剑指offer | 数组中只出现一次的数字)