当前位置: 首页 > 知识库问答 >
问题:

竞争性编程中的平均中位数模式问题

申屠飞
2023-03-14

我在一次公司入学考试中得到了以下问题。除4个测试用例外,所有测试用例均通过。有没有人能试着找出可能出现的情况,哪些可能会失败。问题和解决方案如下:

均值、中位数和模式

给定n个整数,求其平均中值和模式。您需要填写一个接受输入整数“input1”(1)的函数

平均数和中位数必须正确到小数点后六位。

平均值:定义为数组中所有数字的平均值。

中位数:定义为数组的中间元素。

如果n是偶数,则中值是两个中间元素的平均值;如果n是奇数,则中值是数组的中间元素。

注意:为了找到中位数,数组中的元素必须按从小到大的数字顺序列出。

模式:定义为数组中频率最高的数字。如果许多数字具有相同的最高频率,则通过打破有利于最小数字的联系来计算模式。

输入规格:

Input1:范围为1的整数

Input2:整数输入数组。

输出规格:

返回output1(double)变量作为平均值。

返回output2(double)变量作为中位数。

返回output3(int)变量作为模式。

样本测试案例1:

输入1:3

输入2:{1,2,3}

产出:2.000000,2.000000,1

样本测试案例2:

输入1:5

输入2:{41, 18467, 6334, 26500, 19169}

产量:14102.20000018467.00000041

package algo;
import java.util.*;

public class MeanMedianMode 
{
    // Functhtml" target="_blank">ion for calculating mean
    public static double findMean(int n , int a[])
    {
        int sum = 0;
        for (int i = 0; i < n; i++)

        sum += a[i];

    return (double)sum / (double)n;
}

public static double findMedian(int n, int a[])
{
    // First we sort the array
    Arrays.sort(a);

    // check for even case
    if (n % 2 != 0)
        return (double)a[n / 2];

    return (double)(a[(n - 1) / 2] + a[n / 2]) / 2.0;
}

public static int findMode(int n, int a[] ) {
    int maxValue=0, maxCount=0;

    for (int i = 0; i < a.length; ++i) {
        int count = 0;
        for (int j = 0; j < a.length; ++j) {
            if (a[j] == a[i]) ++count;
        }
        if (count >  maxCount) {
            maxCount = count;
            maxValue = a[i];
        }
    }

   return maxValue;
 }

// Driver code
public static void main(String args[])
{
    int a[] = { 41, 18467, 6334, 26500, 19169 };
    int n = a.length;

    System.out.println("Mean = " + String.format("%.6f", findMean(n, a)));
    System.out.println("Median = " + String.format("%.6f", findMedian(n, a)) );
    System.out.println("Mode = " + findMode(n, a));
}
}

编辑:有没有双模、三模数组的场景,比如{1,1,2,2}和{1,1,2,2,3,3},其中模式可以是{1,2}或{1,2,3}。我问这个问题是因为在这种情况下,返回类型将是int[],但有一个问题特别提到,返回类型必须是int。

共有1个答案

阮飞翔
2023-03-14

问题出现在findMode中。你不能处理多个数字具有相同最高频率的情况。问题陈述说:

如果许多数字具有相同的最高频率,则通过打破有利于最小数字的联系来计算模式。

最简单的解决方案是仅当模式值低于先前的模式值时才存储模式值——将模式值初始化为可能的最高值。

public static int findMode(int n, int a[] ) {
    int maxValue = Integer.MAX_VALUE; // Note that a[0]+1 would also work
    int maxCount = 0;
    
    for (int i = 0; i < a.length; ++i) {
        int count = 0;
        for (int j = 0; j < a.length; ++j) {
            if (a[j] == a[i]) ++count;
        }
        if (count >= maxCount && a[i] < maxValue) {
            maxCount = count;
            maxValue = a[i];
        }
    }
    
    return maxValue;
}

请注意,您的算法效率低下,因为它每次出现在列表中都会计算相同的数字。例如,如果1在列表中出现100次,它将计算1的频率100次。

编辑:好的,因为您对数组进行了排序,所以这不是问题所在。

我能想到的另一件事是,findMean中有整数溢出。int可容纳的最大值为2147483647。由于数组可能很大(最多1000个元素),所以很可能int sum无法保存该值。尝试更改为double sum=0

 类似资料:
  • 问题内容: 我在Google App Engine中遇到争用问题,并尝试了解发生了什么。 我有一个注释为的请求处理程序: ..并且在该代码中,我获取了一些东西,更新了其他东西,等等。但是有时在请求期间日志中会出现这样的错误: ..之后是堆栈跟踪。如果需要,我可以使用整个堆栈跟踪进行更新,但这有点长。 我不明白为什么会这样。查看我的代码行中的异常,我在一个完全不同的实体(Round)上运行。错误消息

  • 本文向大家介绍在竞争性编程中高效地编写C / C ++代码,包括了在竞争性编程中高效地编写C / C ++代码的使用技巧和注意事项,需要的朋友参考一下 在竞争性编程中,最重要的是有效的代码。优化和更快的代码很重要,并且可以改变程序员的队伍。 要在竞争性编程中编写有效的c / c ++代码,以下是一些有效的工具,可以有效地编写c / c ++代码, 首先,让我们回顾一些基本术语, 模板正在编写不依赖

  • 问题内容: 我正在尝试计算表中一系列idsofInterest的模式,每个模式都有一个伴随的valueOfInterest: 但有数百万行。 每个idOfInterest列表都足够长,以至于多模式都不是问题。理想情况下,我想要类似 任何帮助表示赞赏。(使用MS SQL Server 2008) 问题答案: 模式是最常见的值。您可以通过聚合和获得此信息:

  • R中的统计分析通过使用许多内置函数来执行。 大多数这些函数都是R基础包的一部分。 这些函数将R vector作为输入与参数一起使用并给出结果。 我们在本章讨论的函数是均值,中位数和模式。 Mean 它是通过取值的总和并除以数据系列中的值的数量来计算的。 函数mean()用于在R中计算。 语法 (Syntax) 计算R中均值的基本语法是 - mean(x, trim = 0, na.rm = FAL

  • 我正在Hackerrank上实现图形算法。 问题陈述: HackerLand的统治者认为该国的每个公民都应该可以访问图书馆。不幸的是,HackerLand被龙卷风袭击,摧毁了所有图书馆并阻碍了道路!由于您是HackerLand最伟大的程序员,统治者希望您帮助修复道路并有效地建造一些新图书馆。 HackerLand有n个城市,编号从1到n。这些城市由m条双向道路连接。如果: 他们的城市有一个图书馆。

  • 问题内容: (注意:这是针对MS SQL Server的) 假设您有一个具有主键标识列和CODE列的表ABC。我们希望此处的每一行都有一个唯一的,顺序生成的代码(基于一些典型的校验位公式)。 假设您有另一个仅具有一行的表DEF,该表存储下一个可用的CODE(想象一个简单的自动编号)。 我知道像下面这样的逻辑将呈现一种竞争状态,其中两个用户可能最终得到相同的CODE: 我知道,两个用户可能会卡在步骤