所以我在过去的两个小时里一直试图弄清楚为什么以下两种方法会给出不同的结果。它们都是采用整数数组的方法,删除其中的任何连续重复项并放入" -1"最后删除每个副本。
方法1给出正确的输出,而方法2变成无限循环。
//Method 1
private static void smoosh1(int[] ints) {
for (int i=0; i<ints.length-1; i++) {
while (ints[i] == ints[i+1] && ints[i] != -1) {
for (int x=i; x<ints.length-1; x++) {
ints[x] = ints[x+1]; }
ints[ints.length-1] = -1;
}
}
}
//Method 2
public static void smoosh(int[] ints) {
for (int i = 0; i < ints.length - 1; i++) {
int curVal=ints[i];
int nextVal=ints[i+1];
while (curVal == nextVal && curVal !=-1) {
for (int x = i; x < ints.length-1; x++) {
ints[x] = ints[x + 1];
}
ints[ints.length-1] = -1;
}
}
请向我解释为什么声明循环中的变量会影响输出。感谢。
注意: - 这个问题来自Berkeley的MOOC 61B的第1部分,作业3。 链接: - https://people.eecs.berkeley.edu/~jrs/61b/hw/hw3/
答案 0 :(得分:0)
为了使第二个代码段的行为与第一个代码段相同,while
循环必须在每次迭代中修改curVal
和nextVal
的值:
public static void smoosh(int[] ints) {
for (int i = 0; i < ints.length - 1; i++) {
int curVal=ints[i];
int nextVal=ints[i+1];
while (curVal == nextVal && curVal !=-1) {
for (int x = i; x < ints.length-1; x++) {
ints[x] = ints[x + 1];
}
ints[ints.length-1] = -1;
curVal=ints[i];
nextVal=ints[i+1];
}
}
}
否则表达式curVal == nextVal && curVal !=-1
的vaule始终保持不变,而while循环从不执行或永不终止。
答案 1 :(得分:0)
你进入while循环的一个(在数组中找到连续的副本)你将永远不会离开,因为curVal和nextVal永远不会改变。 我想你写一个像这样的调试行:
//Method 2
public static void smoosh(int[] ints) {
for (int i = 0; i < ints.length - 1; i++) {
int curVal=ints[i];
int nextVal=ints[i+1];
while (curVal == nextVal && curVal !=-1) {
System.out.println(curVal + " "+ nextVal);
for (int x = i; x < ints.length-1; x++) {
ints[x] = ints[x + 1];
}
ints[ints.length-1] = -1;
}
}