先存着,c语言真就啥都没有呗
struct hashTable {int key;UT_hash_handle hh;
};bool containsDuplicate(int* nums, int numsSize) {struct hashTable* set = NULL;for (int i = 0; i < numsSize; i++) {struct hashTable* tmp;HASH_FIND_INT(set, nums + i, tmp);if (tmp == NULL) {tmp = malloc(sizeof(struct hashTable));tmp->key = nums[i];HASH_ADD_INT(set, key, tmp);} else {return true;}}return false;
}作者:LeetCode-Solution
链接:https://leetcode.cn/problems/contains-duplicate/solution/cun-zai-zhong-fu-yuan-su-by-leetcode-sol-iedd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
实现hashtable,大概写了下int类型的,,大概思路就是一个指针p指向一块内存,
这块内存有若干指针,分别指向一个链表,链表在hash碰撞的时候增加节点,牺牲内存增加速度
#include<stdio.h>
#include<stdlib.h>
#define max_len 50
#define GET_KEY(num) (num)%max_len
typedef struct hashnode {struct hashnode* next;int value;int count;
}Hashnode;
void init(Hashnode** hashtable, int size);
void display(Hashnode** hashtable, int size);
void find(Hashnode** hashtable, int size, int num);
void test_null(Hashnode* p);void main() {int num[max_len * 2];for (int i = 0; i < max_len * 2; i++) {num[i] = i + max_len;printf("%d ", num[i]);}printf("\n");Hashnode** hashtable = (Hashnode**)malloc(max_len * 8 + 8);test_null(hashtable);init(hashtable, max_len);num[98] = 50;for (int i = 0; i < max_len * 2; i++) {find(hashtable, max_len, num[i]);}display(hashtable, max_len);}void init(Hashnode** hashtable, int size) {Hashnode** p = hashtable;for (int i = 0; i < size; i++) {;(*p)= (Hashnode*)malloc(16);test_null(*p);(*p)->next = NULL;(*p)->value = -1;(*p)->count = 0;p++;}
}void display(Hashnode** hashtable, int size) {for (int i = 0; i < size; i++) {Hashnode* p = *(hashtable + i);while (p) {printf("%d %d ", p->value, p->count);p = p->next;}printf("\n");}printf("\n\n");}void find(Hashnode** hashtable, int size,int num) {int pos = GET_KEY(num),flag=0;Hashnode* p = *(hashtable + pos),*q=p;while (p) {if (p->value == -1) {p->value = num;p->count++;flag = 1;break;}if (p->value == num) {p->count++;flag = 1;break;}else {q = p;p = p->next;}}if (!flag) {Hashnode* node = (Hashnode*)malloc(16);test_null(node);node->value = num;node->next = NULL;node->count = 1;q->next = node;}
}
//vs还是会有没检查内存的警告,不知道是这么写有问题还是vs检查不到
void test_null(Hashnode* p) {if (!p) {printf("error\n");exit(1);}
}