线性探测。这个程序有什么问题?

时间:2016-09-10 16:00:26

标签: java arrays

我不知道这段代码有什么问题。但我没有得到所有想要的值作为输出。帮我解释一下这段代码。

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  

2 个答案:

答案 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] + "  ");