这是一天或两天前遇到上一个阵列问题的人。 我们有一个新的任务,要求我们在随机生成的数字数组中查找和替换重复项。我写了一个代码并将其发送给我的老师以获得反馈;她用这个解决方案回答:
所以,取第一个随机数并存储到第一个插槽(这可以在循环之前完成)。然后,启动一个循环,创建第二个随机数并向后测试,以查看是否存在已存储的重复项。因此,一个向后循环测试重复项并从当前位置向下计数并替换重复项。一旦该测试通过,那么你将转到下一个元素,创建一个新的随机数,然后测试它之前的重复项。
我在这里完成了这项工作,它减少了随机生成数字的数量,但我仍然遇到了流浪复制品:
import java.lang.Object;
import java.util.Random;
public class Prog433a {
public static void main(String[]args) {
Random randslct = new Random();
int[] list = new int[20];
int counter = 0;
int index = 0;
int min2 = 0;
System.out.println("\nAfter");
for (int k = 0; k < list.length - 1; k++) {
list [k] = randslct.nextInt(30) + 1;
for (int z = list.length - 1; z >= 0; z--) {
if (list[k] == list[z] && z!=k) {
while (list[k] == list[z]) {
list [k] = randslct.nextInt(30) + 1;
}
}
}
}
int min = list[0];
while (counter < list.length - 1) {
for (int x = 0; x < list.length - 1; x++) { // scroll through the indexes.
if (list[x] < min) {
min = list[x];
index = x; // keep the index of the biggest number.
}
}
System.out.println(list[index]);
min = 100 * (list[index]);
list[index] = 100 * (list[index]); // change the value in the original array so it won't find the same max again
counter++;
}
}
}
系统输出:
After
2
5
6
10
11
12
13
15
16
17
19
22
22
24
25
27
28
29
29
After
1
2
2
4
5
7
8
9
10
13
15
16
21
24
25
26
28
29
30
After
1
2
3
5
6
7
11
12
13
14
15
16
18
21
22
25
26
27
29
After
2
3
3
4
6
10
12
14
15
16
17
20
22
23
24
25
26
27
30
After
7
8
11
12
13
14
15
16
17
17
18
19
20
21
23
24
27
29
30
我把输出贴到底部。 因为这是一个介绍性的编码类,所以我更喜欢解决方案不涉及集合或任何类似的。但唉,乞丐不能选择。
有没有我忘记添加的内容?
答案 0 :(得分:2)
您的问题是,当您检测到重复时,您会生成一个新号码,但您永远不会返回并检查新生成的号码是否与您已检查过的号码重复。当您遇到重复时,您需要通过某种机制重置检查循环。
我修复了代码以解决问题,但它并不是最漂亮的解决方案。当你循环遍历不必要的索引时,我也进行了一些小的优化。
import java.util.Random;
public class Prog433a {
public static void main(String[] args) {
Random randslct = new Random();
int[] list = new int[20];
int counter = 0;
int index = 0;
int min2 = 0;
System.out.println("\nAfter");
for(int k = 0; k < list.length - 1; k++) {
list[k] = randslct.nextInt(30) + 1;
boolean unique = true;
for(int z = k - 1; z >= 0; z--) {
if(list[k] == list[z]) {
if(list[k] == list[z]) {
unique = false;
break;
}
}
}
if(!unique) {
// Repeat last index
--k;
}
}
int min = list[0];
while(counter < list.length - 1) {
for(int x = 0; x < list.length - 1; x++) { // scroll through the indexes.
if(list[x] < min) {
min = list[x];
index = x; // keep the index of the biggest number.
}
}
System.out.println(list[index]);
min = 100 * (list[index]);
list[index] = 100 * (list[index]); // change the value in the original array so it won't find the same max again
counter++;
}
}
}
答案 1 :(得分:1)
您的错误是当您尝试添加新号码时。您只需检查它是否与之前的相同,但如果它与之前的两次相同则不会。你可以这样做:
boolean isDuplicate(int index, int[] list){
for(int i=index-1; i>=0;i--){
if(int[i]==int[index])
return false
}
return true;
}
而不是你的for循环的内部,你现在可以写:
do{
list[k] = randslct.nextInt(30) + 1;
}while(isDuplicate(k, list));
此外,您应该更改输出,例如给已写入的输出一个负值并忽略负值。如果您想将数字更改为例如200你的代码现在无法工作。
答案 2 :(得分:0)
让我们举例说明。请考虑已生成的当前列表是:
list = [5, 7, 9, 3, 8, 9]
其中9是当前号码。
现在在for循环中,您从列表[6]迭代到列表[0]。在这里,比较一下,你来到第二个索引(list [2]),条件
list[k] == list[z] && z != k
结果为真,并生成一个新的随机数。让我们假设您生成的新随机数是&#39; 8&#39;。循环成功终止,您的数组现在有重复。