天天看點

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小何同學 想互相交流的同學可以關注一下哈! 感謝支援!