码迷,mamicode.com
首页 > 编程语言 > 详细

数组中有两种数出现了奇数次,其他数都出现了偶数次,分别找出出现奇数次的数

时间:2020-07-07 00:43:59      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:info   ++   奇数   length   如何   alt   sys   异或   ==   

技术图片

public static void printOddTimesNum2(int[] arr) {
        int eor = 0;
        for (int c : arr) {
            eor ^= c;
        }
        //eor = a^b
        //eor != 0;
        //eor二进制位必然有一位等于1
        int rightOne = eor & (~eor + 1); //原码&补码 = 提取最右1位的 1
        int eor1 = 0;
        for (int i = 0; i < arr.length; i++) {
            if ((arr[i] & rightOne) == 1) { //找出最右1位是1的数做异或运算 注意:出现偶数次的数异或后=0
                eor1 ^= arr[i];  //此时eor1 = 出现奇次数的其中一个
            }
        }
        int otherOdd = eor1 ^ eor;
        System.out.println(eor1 + " " + otherOdd);
    }
//int[] arr2 = {1, 2, 2, 3, 1, 4, 1, 3, 3, 3, 4, 4, 4, 4};

运行结果:

1 4

 

如何提取二进制最右的1

技术图片

数组中有两种数出现了奇数次,其他数都出现了偶数次,分别找出出现奇数次的数

标签:info   ++   奇数   length   如何   alt   sys   异或   ==   

原文地址:https://www.cnblogs.com/pxy-1999/p/13258334.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!