W
e
l
c
o
m
e
: )

从一组数中找出出现奇数次的两种数

   /**
     * 题目描述:在一个数组中,有两个数出现了奇数次(假设是a和b),其它数出现了偶数次,
     * 找出a和b并将它们打印出来
     * @param nums
     */
    public static void printOddTimesNum2(int[] nums){
        int eor = 0;
        for (int i=0;i<nums.length;i++){
            //最终结果:eor = a ^ b
            eor ^= nums[i];
        }
        //找到eor最右侧的那个1
        //eor: 0010 1010 0010 1000
        //-eor: 1101 0101 1101 1000
        int rightOne = eor & (-eor);
        int onlyOne = 0;
        for (int i=0;i<nums.length;i++){
            /*
            * 有了最右侧的1之后,我们就可以把数组中的数分为两组:一组是这一位上为1的,另一组是这一位上为0的
            * 并且a和b必然是处于不同的组中,因为如果它们是同一组,这一位上就是0了,所以我们就可以单独将这一位
            * 上为1的那一组拿出来进行异或,必然可能得到a或者b,最后和eor异或就能得到另一个数了
            */
            if ((nums[i] & rightOne) != 0){
                onlyOne ^= nums[i];
            }
        }
        System.out.println("出现奇数次的两个数分别为:" + onlyOne + "和" + (eor ^ onlyOne));
    }
posted @ 2026-09-18 09:09  寒月静无光  阅读(4)  评论(0)    收藏  举报