题解 | #牛牛算数#

牛牛算数

http://www.nowcoder.com/practice/2470140c86c6480796a487f79cf8df3a

题意整理

  • 给定一个数组,计算中位数和平均数。
  • 如果中位数大于平均数,输出1;如果小于,输出-1;如果等于,输出0。

方法一(排序+模拟)

1.解题思路

  • 首先计算中位数和平均数。
  • 计算中位数时,先对数组排序,如果数组长度是奇数,直接返回最中间的元素;如果是偶数,则返回中间两个数的平均数。计算平均数时,先统计累加和,然后再除以数组中元素个数,即可得到平均数。
  • 判断中位数和平均数的大小,输出对应的值。

动图展示:
图片说明

2.代码实现

import java.util.*;

public class Solution {
    /**
     * 
     * @param arr int整型一维数组 
     * @return int整型
     */
    public int Answerofjudge (int[] arr) {
        //中位数
        double median=getMedian(arr);
        //平均数
        double avg=getAvg(arr);
        //中位数大于平均数,返回1
        if(median>avg){
            return 1;
        }
        //中位数小于平均数,返回-1
        else if(median<avg){
            return -1;
        }
        //中位数等于平均数,返回0
        else{
            return 0;
        }
    }

    //计算中位数
    private double getMedian(int[] arr){
        //排序
        Arrays.sort(arr);
        int n=arr.length;
        if(n%2==1){
            return arr[n/2];
        }
        else{
            return (arr[n/2-1]+arr[n/2])/2.0;
        }
    }

    //计算平均数
    private double getAvg(int[] arr){
        int n=arr.length;
        //累加和
        double sum=0.0;
        for(int i=0;i<n;i++){
            sum+=arr[i];
        }
        return sum/n;
    }
}

3.复杂度分析

  • 时间复杂度:排序的时间复杂度为,其它循环是线性的,所以时间复杂度为
  • 空间复杂度:需要额外常数级别的空间,所以空间复杂度为

方法二(按平均数分组)

1.解题思路

  • 首先计算数组的平均数。
  • 然后按平均数分为小于平均数的部分和大于等于平均数的部分。记录arr数组中小于平均数部分的最大值,大于平均数部分的最小值。
  • 如果小于平均数的元素的数量大于,则中位数一定在小于平均数的部分取,中位数必定小于平均数,返回-1;如果小于平均数的元素的数量小于,则中位数一定在大于平均数的部分取,中位数必定大于平均数,返回1;如果小于平均数的元素的数量等于,则中位数要么取大于平均数的最小值,要么取大于平均数的最小值和小于平均数的最大值两者的平均数,然后根据情况,返回对应的值。

2.代码实现

import java.util.*;

public class Solution {
    /**
     * 
     * @param arr int整型一维数组 
     * @return int整型
     */
    public int Answerofjudge (int[] arr) {
        //平均数
        double avg=getAvg(arr);
        //num1记录arr数组中小于平均数的最大值,num2记录arr数组中大于平均数的最小值
        int num1=0,num2=Integer.MAX_VALUE;
        //cnt记录arr数组中小于平均数的个数
        int cnt=0,n=arr.length;
        for(int a:arr){
            if(a<avg){
                cnt++;
                num1=Math.max(num1,a);
            }
            else{
                num2=Math.min(num2,a);
            }
        }
        //如果小于平均数的个数有n/2个
        if(cnt==n/2){
            //如果n是奇数,则中位数恰好为num2
            if(n%2==1){
                if(avg<(double)num2) return 1;
                else if(avg>(double)num2) return -1;
                else return 0;
            }
            //如果n是偶数,则中位数为num1与num2的平均数
            else{
                if(avg<(num1+num2)/2.0) return 1;
                else if(avg>(num1+num2)/2.0) return -1;
                else return 0;
            }
        }
        return cnt>n/2?-1:1;
    }

    //计算平均数
    private double getAvg(int[] arr){
        int n=arr.length;
        //记录累加和
        double sum=0.0;
        for(int i=0;i<n;i++){
            sum+=arr[i];
        }
        return sum/n;
    }
}

3.复杂度分析

  • 时间复杂度:所有循环都是线性的,所以时间复杂度为
  • 空间复杂度:需要额外常数级别的空间,所以空间复杂度为
xqxls的题解 文章被收录于专栏

牛客题解

全部评论

相关推荐

程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
在debug的柠檬精很迷人:好消息:现在HR挑三拣四 15年后 HR跪着求要简历 坏消息:被挑的是这代人,到时候求人的也是这代人。真好。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务