【发布时间】:2021-05-11 06:49:43
【问题描述】:
我在公司的一次入学考试中得到了以下问题。除 4 个测试用例外,所有测试用例均通过。有人可以尝试找出可能的情况,这可能会失败。问题及解决方法如下:
均值、中位数和众数
给定“n”个整数,求它们的平均中位数和众数。 要求您填写一个接受输入整数 'input1' (1input2[] 包含 'input1' 整数并返回 output1 作为平均值 output2 作为中位数,output3 作为众数。
平均值和中位数必须正确到小数点后六位。
平均: 定义为数组中所有数字的平均值。
中位数: 定义为数组的中间元素。
如果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.200000,18467.000000,41
package algo;
import java.util.*;
public class MeanMedianMode
{
// Function 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。
【问题讨论】:
-
我想说这个问题在
findMode。您似乎没有处理多个具有相同最高频率的数字的情况。 -
@Johnny Moop 但在这种情况下 int[ ] 将是返回类型
-
@ASharma7 不行,你必须返回最小值
-
问题特别提到返回类型必须是int
-
@JohnnyMopp 这就是问题所在,均值和中值均破并开始给出负值。请在答案中添加这个