描述
给你一个含有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);
最后
大家可以去 【牛客网-题库-在线编程】去练习一下。
可以去微信搜索:【蘑菇睡不着】交个朋友~
也可以扫描下方二维码。