首页 > 解决方案 > 循环中守卫的数组索引?它实际上在检查什么?

问题描述

这些是用于使用开放寻址实现哈希映射的 C 代码部分。我不明白 insert 函数中的 while 循环正在检查什么,而 twoSum 函数中的 if 语句正在检查什么。

while 循环条件是否检查值是否在数组中或值是否不为空。if 语句是否检查值是否不为 0?我不明白。

我一直认为这样的事情会像需要手动中断的 while(1) 循环一样工作。

我想知道循环保护语句的条件是什么,我了解正文。

void insert(int *keys, int *values, int key, int value) {
    int index = hash(key);
    while (values[index]) { // What does this check for?
        index = (index + 1) % SIZE;
    }
    keys[index] = key;
    values[index] = value;
}
int* twoSum(int* nums, int numsSize, int target) {
    int keys[SIZE];
    int values[SIZE] = {0};
    for (int i = 0; i < numsSize; i++) {
        int complements = target - nums[i];
        int value = search(keys, values, complements);
        if (value) { // What does this line check for?
            int *indices = (int *) malloc(sizeof(int) * 2);
            indices[0] = value - 1;
            indices[1] = i;
            return indices;
        }
        insert(keys, values, nums[i], i + 1);
    }
    return NULL;
}

标签: cloopshashhashmapboolean

解决方案


我们只能猜测。

看起来 期望指向始终具有值为零的最终元素的数组的指针,insert函数的设计者选择了该约定来表示“数组的结尾”。

当搜索失败时,它看起来返回零。 search

然而,任何一个都可能是一个错误(我很怀疑,因为这种设计禁止将零视为“真实”/有效值),并且两者都可以说是糟糕的设计 - 在前一种情况下,为什么不将数组大小传递为一个论点?在后一种情况下,为什么不返回bool并给出结果(如果成功)作为“输出参数”,就像其他 C API 一样?

最终,我们无法神奇地知道函数的先决条件,因此您必须询问编写它的人。

这就是为什么代码应该有解释性注释。


推荐阅读