输入n个数,其中一个数的个数大于等于n/2,请输出那个数

问题描述:输入n个数,其中一个数的个数大于等于n/2,请输出那个数

例如:

输入:

18

3 3 5 4 3 2 4 2 3 3 4 5 2 13 3 3 3 3

输出:3

第一种方法:用map集合做,key-value分别对应数组元素和出现次数,代码如下:

/**
     * 
     * @param arr  传入数组
     * @param n    数组长度
     */
    public static void code(int[] arr,int n){
        Map<Integer,Integer> mp = new HashMap<Integer,Integer>();
        for(int i = 0;i<n;i++){
            if(!mp.containsKey(arr[i])){
                int count = 0;
                mp.put(arr[i],++count);
                for(int j = i+1;j<n;j++){
                    if(arr[j] == arr[i]){
                        mp.put(arr[j],++count);
                    }
                }
            }
        }
        for(Map.Entry<Integer,Integer> e : mp.entrySet()){
      //这块if判断需要注意的是,当数组长度为奇数时,获取的value值要大于n/2。为偶数大于等于n/2
if(e.getValue()>n/2 && n%2 == 1 || e.getValue()>=n/2 && n%2 == 0){ System.out.println(e.getKey()); return; } } }

第二种方法:

先看下面几个例子,蓝色是下标,先对输入数组排序(升序)

偶数个元素
0    1    2    3    4    5

1    1    1    2    2    3    这个输出1

1    2    2    3    3    3    这个输出3        

1    2    2    2    3    3    这个输出2


奇数个元素
0    1    2    3    4

1    1    1    2    2        这个输出1

1    2    2    2    3        这个输出2

从上面的例子可以看出,当数组长度为奇数时,直接返回下标为n/2的值,当数组长度为偶数时,如果第一个元素和n/2-1下标对应元素相等就返回第一个元素,否则返回下标为n/2的值,代码如下:

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入数组大小");
        int n = sc.nextInt();
        int[] arr = new int[n];
        for(int i = 0;i<n;i++){
            arr[i] = sc.nextInt();
        }
        Arrays.sort(arr);
        if(n%2 == 0 &&arr[n/2-1] == arr[0]){
            System.out.println(arr[0]);
        }else{
            System.out.println(arr[n/2]);
        }

    }
}

猜你喜欢

转载自www.cnblogs.com/du001011/p/10920800.html