пытаюсь решить 217. Содержит дубликат в C с помощью HashSet.
после того, как я попытался сделать расчетный индекс всегда (+), я получил ошибку.
#define BUCKET_SIZE 1000
typedef struct ListNodes {
int val;
struct ListNodes* next;
} ListNode;
typedef struct {
ListNode* buckets[BUCKET_SIZE];
} MyHashSet;
// create hash table
MyHashSet* myHashSetCreate() {
MyHashSet* obj = (MyHashSet*) malloc(sizeof(MyHashSet));
for(int i = 0 ; i < BUCKET_SIZE ; i++ ) {
obj -> buckets[i] = NULL;
}
return obj;
}
bool myHashSet(MyHashSet* obj, int key) {
unsigned int index = key % BUCKET_SIZE; // problem here
ListNode* current = obj->buckets[index];
while(current != NULL) {
if (current -> val == key) return true;
current = current -> next;
}
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = key;
newNode->next = obj->buckets[index];
obj->buckets[index] = newNode;
return false;
}
// task function
bool containsDuplicate(int* nums, int numsSize) {
MyHashSet* obj = myHashSetCreate();
for(int i = 0 ; i < numsSize ; i++) {
if (myHashSet(obj, nums[i])) {
return true;
}
}
return false;
}
unsigned int index = key % BUCKET_SIZE;
результат :
Строка 23: Символ 15: ошибка выполнения: загрузка адреса 0x6258000078f0 с недостаточным пространством для объекта типа «struct ListNode *» [solution.c] 0x6258000078f0: примечание: здесь указывает указатель
ListNode* current = obj->buckets[index];
я исправил ошибку:
int index = key % BUCKET_SIZE;
или
int index = key % BUCKET_SIZE;
if ( index < 0) {
index *= -1;
}
есть идеи, почему код ведет себя странно?
Маам-мэм, Любопытно, почему код использует int для индексации buckets[] в obj -> buckets[i] = NULL;, а позже использует unsigned в obj->buckets[index] = newNode;? Совет: лучший тип индексации массива — size_t, беззнаковый тип.
Примечание @chux-ReinstateMonica принято !! ты мне очень помог, еще раз спасибо





Избегайте знаковой математики:
bool myHashSet(MyHashSet* obj, int key) {
unsigned int index = key % BUCKET_SIZE;
изменить на
bool myHashSet(MyHashSet* obj, unsigned key) {
unsigned int index = key % BUCKET_SIZE;
// or
bool myHashSet(MyHashSet* obj, int key) {
unsigned int index = (unsigned) key % BUCKET_SIZE;
// or
// #define BUCKET_SIZE 1000
#define BUCKET_SIZE 1000u
// or ...
При исходном unsigned int index = key % BUCKET_SIZE;key % BUCKET_SIZE вычисляет остаток , который находится в диапазоне от -999 до 999. Преобразование отрицательного числа в unsigned приводит к большим значениям unsigned.
Ты легенда, спасибо, приятель! Я только сегодня изучил unsigned и относился к нему как к встроенной функции, а не как к типу данных. моя глупость всегда меня удивляет
В сторону: Не приводите результат malloc.