我不知道这段代码有什么问题。但我没有得到所有想要的值作为输出。帮我解释一下这段代码。
public class LinearProbing{
public static void main(String[] args) {
int[] arr = new int[13];
int[] inputs = {18,41,22,44,59,32,31,73};
int element = inputs[0] % 13;
for (int i = 0, j = 0; i < 13;i++) {
if(arr[element] != 0){
element++;
continue;
}
arr[element] = inputs[j++];
element = inputs[j]%13;
}
for (int i = 0; i < 13; i++) {
System.out.print(arr[i]+" ");
}
}
}
我想要的输出是:
0 0 41 0 0 18 44 59 32 22 31 73 0
我得到的输出是:
0 0 41 0 0 18 44 59 32 22 0 0 0
答案 0 :(得分:0)
提示1:检查你的第一个循环。条件不应该以某种方式涉及inputs
的长度吗?
提示2:执行element++;
可能会导致越界索引。
提示3:如果您尝试插入14个元素会发生什么?
答案 1 :(得分:0)
如果您实际上调试您的代码,您会发现您的循环过早退出,因为13次迭代不会这样做。实际上,无论您如何修改循环条件,您的代码都无法按照书面形式提供您请求的输出。
为了使结果包含73
,必须执行此语句,其中j
引用inputs
的最后一个元素:
arr[element] = inputs[j++];
但是,如果j
引用了最后一个元素,则下一行将失败,因为j
现在超过了inputs
的长度:
element = inputs[j]%13;
因此,删除循环条件,即删除i
,然后在j
超过inputs
长度时中断:
int[] arr = new int[13];
int[] inputs = { 18, 41, 22, 44, 59, 32, 31, 73 };
int element = inputs[0] % 13;
for (int j = 0; ; ) {
if (arr[element] != 0) {
element++;
continue;
}
arr[element] = inputs[j++];
if (j == inputs.length)
break;
element = inputs[j] % 13;
}
for (int i = 0; i < 13; i++) {
System.out.print(arr[i] + " ");
}
或者,更好的是,现在你看到那个愚蠢的for
循环,只有一个初始化器,你会意识到你的if (...) { ...; continue; }
语句实际上是一个while (...) { ... }
循环,所以你可以重构代码,为溢出arr
数组添加一个额外的保护条件:
int[] arr = new int[13];
int[] inputs = { 18, 41, 22, 44, 59, 32, 31, 73 };
OUTER: for (int i = 0; i < inputs.length; i++) {
int element = inputs[i] % 13;
while (arr[element] != 0)
if (++element == arr.length)
break OUTER;
arr[element] = inputs[i];
}
for (int i = 0; i < 13; i++)
System.out.print(arr[i] + " ");