3

我需要编写一个程序来查找一个数字是否多次出现在 50 个数字的数组中。

我有生成 50 个随机数的数组,但似乎无法通过编写循环来查看有多少是相同的。

4

2 回答 2

1

numbers以下代码将计算每个滚动数字并在地图中存储计数:

Map<Integer, Integer> numbers = new HashMap<Integer, Integer>();
for (int i = 0; i < 50; i++) {
    Integer num = die.roll();
    Integer count = numbers.get(num);
    if (count == null) {
        count = Integer.valueOf(0);
    }
    count = Integer.valueOf(count.intValue() + 1);
    numbers.put(num, count);
}

然后您可以检查所有地图条目并找到那些滚动多次的条目。

for (Map.Entry<Integer, Integer> entry : numbers.entrySet()) {
    if (entry.getValue().intValue() > 1) {
        System.out.println(entry.getKey() + " rolled more than once");
    }
}

或者您可以在第一个循环中更改条件以在那里输出数字:

for (int i = 0; i < 50; i++) {
    Integer num = die.roll();
    Integer count = numbers.get(num);
    if (count != null) {
        System.out.println(num + " rolled more than once");
    } else {
        numbers.put(num, Integer.valueOf(1));
    }
}

最后,您仍然可以使用数组在其中查找数字:

for (int i = 0; i < 50; i++) {
    nums[i] = die.roll();
    for (int j = i - 1; j >= 0; j--) {
        if (nums[i] == nums[j]) {
            System.out.println(nums[i] + " rolled more than once");
            break;
        }
    }
}
于 2012-11-29T16:40:09.563 回答
0

您可以尝试对数据进行排序

int[] nums = new int[50];
for(int i = 0; i < nums.length; i++) nums[i] = die.roll();
java.util.Arrays.sort(nums);
int dupes = 0;
for(int i = 0; i < nums.length - 1; i++) {
    if(nums[i] == nums[i+1) dupes++;
}

对数据进行排序会将所有相等的元素彼此相邻,因此您可以一次性找到它们。当然,您必须对其进行排序,这不是一次性操作。

这消除了使用地图的开销,并且仍然非常快。排序是n lg n,这比n使用地图的解决方案要慢,但如果使用如此小n的地图,地图的开销可能会很大。代码本身也很容易理解。

请参阅这个在 10 元素数组中使用数字 0-19 的自包含示例(缩小数字以便于查看;该概念完全适用。)

import java.util.*;
class Christine {
    static Random random = new Random();
    static int dieroll() {
        return random.nextInt(20);
    }
    public static void main(String[] args) {
        int[] nums = new int[10];
        for(int i = 0; i < nums.length; i++) nums[i] = dieroll();
        System.out.println(Arrays.toString(nums));
        Arrays.sort(nums);
        int dupes = 0;
        for(int i = 0; i < nums.length - 1; i++) {
            if(nums[i] == nums[i+1]) dupes++;
        }
        System.out.println(dupes);
    }


}

您像这样运行示例:

c:\files\j>javac Christine.java

c:\files\j>java Christine
[2, 9, 8, 5, 11, 12, 15, 15, 16, 7]
1

c:\files\j>java Christine
[10, 10, 1, 18, 11, 6, 4, 3, 9, 5]
1

c:\files\j>java Christine
[8, 0, 13, 4, 5, 4, 16, 13, 6, 18]
2

在第一次运行中,有两个 15。在第二个中,有两个 10。第三个,有两个 13 和两个 4。

考虑这个例子:

c:\files\j>java Christine
[17, 19, 19, 3, 19, 4, 18, 19, 1, 1]
4

这计算了 4 个不同的 19 的 3 个欺骗,以及两个 1 的欺骗。现在为什么19s有3个骗子?因为如果我们称 19 为 a、b、c 和 d,a 将 b 视为骗子,b 将 c 视为骗子,c 将 d 视为骗子。所以有三个。您必须添加额外的逻辑以使其更健壮地捕获所有 6 个骗子。

于 2012-11-29T17:03:51.843 回答