【发布时间】:2014-01-16 14:07:40
【问题描述】:
所以我需要一种方法来在 1000 个元素的数组中找到模式,每个元素使用从 0 到 300 的 math.Random() 随机生成。
int[] nums = new int[1000];
for(int counter = 0; counter < nums.length; counter++)
nums[counter] = (int)(Math.random()*300);
int maxKey = 0;
int maxCounts = 0;
sortData(array);
int[] counts = new int[301];
for (int i = 0; i < array.length; i++)
{
counts[array[i]]++;
if (maxCounts < counts[array[i]])
{
maxCounts = counts[array[i]];
maxKey = array[i];
}
}
这是我目前的方法,它给了我出现次数最多的数字,但如果事实证明其他事情发生的次数相同,它只输出一个数字并忽略其余的数字。
我们不允许使用 ARRAYLIST 或 HASHMAP(老师禁止使用)
请帮助我了解如何修改此代码以生成包含随机数组中所有模式的数组输出。
谢谢你们!
编辑:
谢谢你们,我明白了:
private static String calcMode(int[] array)
{
int[] counts = new int[array.length];
for (int i = 0; i < array.length; i++) {
counts[array[i]]++;
}
int max = counts[0];
for (int counter = 1; counter < counts.length; counter++) {
if (counts[counter] > max) {
max = counts[counter];
}
}
int[] modes = new int[array.length];
int j = 0;
for (int i = 0; i < counts.length; i++) {
if (counts[i] == max)
modes[j++] = array[i];
}
toString(modes);
return "";
}
public static void toString(int[] array)
{
System.out.print("{");
for(int element: array)
{
if(element > 0)
System.out.print(element + " ");
}
System.out.print("}");
}
【问题讨论】:
-
模式是指在一组中出现次数最多的东西。例如,给定集合 {1,1,1,1,1,1,2,3},1 将是模式,因为它出现的次数最多。
-
提示:你已经计算了
maxCounts;现在编写第二个循环,通过counts。 -
@ajb 这将如何工作?即使我运行了第二个循环,第三种模式呢?第四?
-
老师有没有说过使用
SET数据结构? TreeSet 可用于简洁的解决方案。 -
@user3200640 你有一个
counts数组,你有maxCounts。如果counts[i]等于maxCounts,对于任何i,那么您已经找到了一种模式。您将能够通过这种方式找到所有这些。在我看来,您的原始代码走在了正确的轨道上;看起来您的第二次尝试只是不必要地使事情复杂化。