天天看点

java中异或运算 两个数出现奇数次 其他数出现偶数次 求这两个数

import java.util.Scanner;

public class code06 {
    /*
    题目描述: 两种数出现奇数次 其他数出现偶数次  求这两个数
    0^n=n  n^n=0
    两个数 怎么办
    思路:
    两个数异或后的数a^b=eor一定不为0  找到eor的最右边的1
    将一个数eor'把它最右边的数设为1其他为设为0 那么用eor'来和数组中的数相与
    虽然有偶数但是偶数的次数会相互抵消  只剩下a和b其中一个
    然后再用eor异或a或者b都可以得到另外一个
    * */
    public static void printOddTimesNum2(int[] arr) {
        int eor = 0;
        for (int i = 0; i < arr.length; i++) {
            eor ^= arr[i];
        }
        // a 和 b是两种数
        // eor != 0
        // eor最右侧的1,提取出来
        // eor :     00110010110111000
        // rightOne :00000000000001000
        int rightOne = eor & (-eor); // 提取出最右的1

        int onlyOne = 0; // eor'
        for (int i = 0 ; i < arr.length;i++) {
            //  arr[1] =  111100011110000
            // rightOne=  000000000010000
            if ((arr[i] & rightOne) != 0) {
                onlyOne ^= arr[i];
            }
        }
        //异或后的onlyone则必定会a或者b其中一个
        System.out.println(onlyOne + " " + (eor ^ onlyOne));
    }
    public static void main(String[] args) {
        System.out.println("请输入:");
        Scanner sc = new Scanner(System.in);
        String str=sc.nextLine().toString();
        //数字之间用空格隔开
        String[] arr=str.split(" ");
        int[] b=new int[arr.length];
        //输出
        for (int j=0;j<b.length;j++){
            b[j]=Integer.parseInt(arr[j]);
//            System.out.println(b[j]);
        }
        printOddTimesNum2(b);
    }
}      

新创建一个公众号 Rockey小何同学 想相互交流的同学可以关注一下哈! 感谢支持!