美文网首页
剑指offer | 数组中只出现一次的数字

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

作者: icebreakeros | 来源:发表于2019-07-31 12:19 被阅读0次

    数组中只出现一次的数字

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

    示例
    输入:{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 | 数组中只出现一次的数字

          本文链接:https://www.haomeiwen.com/subject/bcmzrctx.html