用位运算查找一个出现奇数次的数和两个出现奇数次的不同数,代码实现

上代码:
package com.alg.exclusive;

public class classify {
    public static void main(String[] args) {
//      找出数组中其中只出现奇数次的数
        int[] arr = {1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8};
        System.out.println(classify(arr));
//      找出有两个只出现奇数次的不同数
        int[] arr1 = {1, 1, 2, 2, 200, 300, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 8, 7, 8, 9, 9, 0, 0};
        int[] arr2 = classifyNums(arr1);
        for (int cur : arr2) {
            System.out.println(cur);
        }
    }

    public static int classify(int[] arr) {
        int num = 0;
        for (int cur :
                arr) {
            num ^= cur;
        }
        return num;
    }

    public static int[] classifyNums(int[] arr) {
        int temp = 0;
        for (int cur :
                arr) {
            temp ^= cur;
        }
//      得到右边的位为1的数,其他位均为0  ~temp+1此处为补码
        int rightOne = temp & (~temp + 1);
        int[] num = new int[2];
        for (int cur :
                arr) {
            if ((rightOne & cur) == 0) {
                num[0] ^= cur;
            }
        }
        num[1] = num[0] ^ temp;
        return num;
    }
}

 

posted @ 2022-07-23 20:51  努力学习の小白  阅读(26)  评论(0编辑  收藏  举报
Live2D