Я получаю ошибку во время выполнения на Leetcode № 1 (две суммы) - PullRequest
0 голосов
/ 02 марта 2019

Я использовал хеш-таблицу с линейным зондированием для решения этой проблемы.И я проверил свой код в Visual Studio и получил правильное решение.Вот код:

#define HTCAPACITY 50000

int hash(int key) {
    return key % HTCAPACITY;
}

void htInsert(int *keys, int *values, int key, int value) {
    int index = hash(key);

    while(values[index] >= 0)
        index = (index + 1) % HTCAPACITY;
    keys[index] = key;
    values[index] = value;
}

int htSearch(int *keys, int *values, int key) {
    int index = hash(key);

    while(values[index] >= 0) {
        if(keys[index] == key)
            return values[index];
        index = (index + 1) % HTCAPACITY;
    }
    return -1;
}


int* twoSum(int* nums, int numsSize, int target) {
    int keys[HTCAPACITY] = {0};
    int values[HTCAPACITY];
    memset(values, -1, sizeof(int)*HTCAPACITY);
    int i;
    int value = -1;
    int *indices = (int *)malloc(sizeof(int)*2);
    int complement;

    for(i=0; i<numsSize; i++) {
        complement = target - nums[i];
        if((value = htSearch(keys, values, complement)) != -1) {
            indices[0] = value;
            indices[1] = i;
            return indices;
        } else {
            htInsert(keys, values, nums[i], i);
        }
    }
    return NULL;
}

И описание ошибки здесь: (извините, я не могу скопировать сообщение напрямую) описание ошибки

И leetcode сказал, что последнийвыполненный ввод [0, 4, 3, 0] и 0

1 Ответ

0 голосов
/ 02 марта 2019

вы не включили тестовую программу или точный ввод в вашу функцию.Однако я рискну предположить, что дополнение окажется отрицательным.

Ваша ошибка, скорее всего, ваша хеш-функция.Вы используете% (оператор остатка) для значения хеша.% для отрицательных чисел возвращает отрицательное число.См. Операция по модулю с отрицательными числами

Я подозреваю, что вы получаете отрицательное значение ключа, которое заставляет значения и ключи ссылаться на память раньше их выделения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...