问题提出:给一串数,求解在这串数当中为奇数位数的数是哪个数

package dataStructure.eor;

import java.util.HashSet;

public class EroSelectSingleOddNumber {
    
    
    /**
     * 问题提出:给一串数,求解在这串数当中为奇数位数的数是哪个数
     * 方法分析,可以使用暴力循环的方式来求解出为奇数位数的数是哪个,但是使用异或运算来求解将会相当简便。
     */
    public static int ero(int[] arr) {
    
    
        int number = 0;
        for (int i = 0; i < arr.length; i++) {
    
    
            /**
             * 异或运算
             * 异或运算的原理是因为异或运算就是无进位的二进制相加运算,偶数个数就会相加成0,但是奇数个数的数异或以后还会回到这个数本身
             * 异或运算具有交换律性质,数据的奇数还有偶数所在的位置计算没有影响
             */
            number ^= arr[i];
        }
        return number;
    }
    /**
     * 常规方法
     *
     */
    public static int hashSelect(int[] arr) {
    
    
        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < arr.length; i++) {
    
    
            //查看HashSet当中有没有这个值,如果没有,就添加进来
            if (!set.contains(arr[i])) {
    
    
                set.add(arr[i]);
             //如果有这个值了,弹出
            } else {
    
    
                set.remove(arr[i]);
            }
        }
        for (int i = 0; i < arr.length; i++) {
    
    
            //查看拣取出来的值
            if (set.contains(arr[i])) {
    
    
                return arr[i];
            }
        }
        //-1表示没有具有奇数个数的数
        return -1;
    }
    public static void main(String[] args) {
    
    
        int[] arr = {
    
    1, 2, 2, 3, 3, 3, 3, 2, 1, 1, 1};
        System.out.println("个数为奇数的值:" + ero(arr));
        System.out.println("个数为奇数的值:" + hashSelect(arr));
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35712788/article/details/114240392