此代码仅显示最大发生值而非最大值且发生最大值。
System.out.println(countMax(new int[] {6,3,1,3,4,3,6,5}));
static int countMax(int[]a) {
int count = 1, tempCount;
int maxCount = a[0];
int temp = 0;
for(int i =0; i < a.length - 1; i++) {
temp = a[i];
tempCount = 0;
for(int j = 1; j < a.length; j++) {
if(temp == a[j])
tempCount++;
}
if(tempCount > count)
maxCount = temp;
count = tempCount;
}
return maxCount;
}
答案 0 :(得分:4)
您必须保留一个额外的变量,其中包含当前最大值的计数。你不需要两个循环,只需要一个:
static int countMax(int[] a) {
int max = Integer.MIN_VALUE;
int count = 0;
for (int curr : a) {
if (curr > max) {
max = curr;
count = 1;
} else if (curr == max) {
++count;
}
}
return count;
}
或者,Java 8的流提供了一种非常简单的方法,尽管不是太高效的方式来为您完成所有繁重的工作:
static int countMax(int[] a) {
return Arrays.stream(a)
.boxed()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.max(Map.Entry.comparingByKey())
.map(Map.Entry::getValue)
.orElse(0L)
.intValue();
}
答案 1 :(得分:1)
在这种情况下,您只存储并返回最大发生次数的计数。尝试存储号码。
答案 2 :(得分:1)
这是实现这一目标的一种方法。也许不是最好的。
步骤1: - 按升序对数组进行排序。
第2步:从数组末尾开始计算相等元素的数量。
myFunc(this);
答案 3 :(得分:0)
您应该采取两步解决方案:
因此,您必须迭代数组两次 - 一次找到最大值,一次计算它。
如果您仍有问题,请参阅以下代码段:
public static int countMax(int[] values) {
// first, find the maximum value
int maxValue = Integer.MIN_VALUE;
for (int i = 0; i < values.length; ++i) {
maxValue = Math.max(maxValue, values[i]);
}
// then count the maximum value
int maxCount = 0;
for (int i = 0; i < values.length; ++i) {
if (values[i] == maxValue) maxCount++;
}
return maxCount;
}
答案 4 :(得分:-1)
蛮力:
创建地图
现在迭代数组 - 对于数组中的每个项目,检查它是否已经在Map中(作为键)。
如果是,请获取值,将其递增1,然后将其放回Map中。
如果它已经不在Map中,请将其放入初始值为1。