找出数组中出现了奇数次的两个数

找出数组中出现了奇数次的两个数

题目描述

一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数

题目思路:

思路:对数组所有的数进行异或运算,偶数个数的数异或结果为0,将这两个要找的数标记为A、B,也就是最终结果为A、B异或的结果,此时取出右边第一个1,A、B在此位置的值不相同,一个为1,另一个为0,根据这个特点将这些数据分为两两组,分别异或.

图示:

代码:

package com.courage.algorithm;
/*
一个数组中有两种数出现了奇数次,
其他数都出现了偶数次,怎么找到并打印这两种数
*
 */
public class FindTwoNumber {
    public static void main(String[] args) {
       int [] arr = {1,1,2,2,3,3,4,4,5,6,6,7,8,8,9,9};
        findTwoNumber(arr);

    }
    /*
     * 思路:对数组所有的数进行异或运算,偶数个数的数异或结果为0,将这两个要找的数标记为A、B
     *      也就是最终结果为A、B异或,此时取出右边第一个1,A、B再此位置的值不相同,一个为1,
     *       另一个为0,根据这个特点将这些数据分为两拨,分别异或.
     *
     * */
    public static void findTwoNumber(int[] arr) {

        int temp = 0;
        for (int i = 0; i < arr.length; i++) {
            temp ^= arr[i];
        }
        int markBite = findBit1RightNumber(temp);
        int A = 0;
        int B = 0;
        for (int i = 0; i < arr.length; i++) {
            if ((arr[i] & markBite) == markBite){
                A ^= arr[i];
            }else{
                B ^= arr[i];
            }
        }
        System.out.println("奇数个数的两个数分别为:"+A+"、"+B);
    }
    //找出所给数字右边第一个非零位
    public static int findBit1RightNumber(int number) {
        int temp = ~number;
        temp += 1;
        temp = number & temp;
       return temp;
    }

}
posted @ 2020-12-16 19:31  等不到的口琴  阅读(616)  评论(0编辑  收藏  举报