描述

给你一个含有n个元素的数组arr[i],问这个数组的中位数大还是平均数大,如果中位数更大输出1,如果平均数更大输出-1,如果中位数和平均数相等输出0。

示例1

输入:
[1,3,4]

返回值:
1

说明:
中位数3,平均数约等于2.67,所以输出1 

示例2

输入:
[7,4,8,11]

返回值:
0

说明:
中位数7.5,平均数7.5,所以输出0 

示例3

输入:
[6,6,6,6,5,8]

返回值:
-1

说明:
中位数6,平均数约等于6.17,所以输出-1

思路

这道题主要是求平均数以及中位数,只要拿到这两个就可以。
中位数求法(数组有序的情况下):

  • 长度是奇数:直接长度 / 2 即可;
  • 长度是偶数:找到中间的两个数,相加 / 2,但是这时要注意 Java 的 "/" 会自动向下取整,所以需要用小数来表示,数据类型用 double 就可以。

平均数求法:

  • 相加所有数的总和 / 总数,这个也要注意小数情况,实现方法同上。

AC 代码

public int Answerofjudge (int[] arr) {
        // write code here        
        if (arr == null || arr.length < 1) {
            return 0;
        }
        int length = arr.length;
        // 数组求和
        double sum = 0;
        for (int i = 0; i < arr.length; i++ ){
            sum += arr[i];
        }
        // 求平均数
        double avg = sum /(double)arr.length;
        // 数组排序
        Arrays.sort(arr);

        int num = arr.length >> 1;
        // 求中位数:注意长度是奇偶情况,奇数就是 中间的一个数;偶数则是中间两个数的平均值(要注意小数情况)
        double mid = (length & 1) == 1 ? (double)arr[num] : (double) ((arr[num] + arr[num - 1]) / 2.0);

        return mid > avg ? 1 : mid < avg ? -1 : 0;
    }
  • 时间复杂度:这道题主要是遍历一遍数组,以及对数组排序,取最大,时间复杂度为 O(nlog^n);
  • 空间复杂度:也是基于上面排序使用的,O(log^n);

最后

大家可以去 【牛客网-题库-在线编程】去练习一下。
可以去微信搜索:【蘑菇睡不着】交个朋友~
也可以扫描下方二维码。

图片说明