我需要编写一个程序来查找一个数字是否出现在50个数字的数组中不止一次。
我有数组生成50个随机数但似乎不能让我的头围写循环来看看有多少是相同的..
答案 0 :(得分: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;
}
}
}
答案 1 :(得分: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个不同的19s计算3个dupes,并为两个1s计算。现在为什么19岁时有3个骗局?因为如果我们将19s称为a,b,c和d,则将b视为欺骗,b将c视为欺骗,而c将d视为欺骗。所以有三个。你必须添加额外的逻辑,以便更好地捕获所有6个dupes。