题解 | #两数之和#

两数之和

https://www.nowcoder.com/practice/20ef0972485e41019e39543e8e895b7f

LeetCode上做题可以用开源库uthash.h库解决C语言的哈希表问题,比较方便。但牛客网上好像不支持该库的使用,所以就自行把哈希表用到的函数都写了一遍,包括创建哈希表、插入键值对、查找键值对、删除键值对以及删除整个哈希表。解题的思路大致跟官方答案一致,可以参考一下哈希表各个函数的用法,加深印象

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param numbers int整型一维数组 
 * @param numbersLen int numbers数组长度
 * @param target int整型 
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 */
 #define TableSize 10000
 #define NoExist -1 //表示要寻找的值不存在

 typedef struct HashNode{
    int key; //整数数值
    int val;    //下角标
    struct HashNode* Next;
 } HashNode; //定义哈希结点

 typedef struct HashTable{
    HashNode** Buckets;
 } HashTable; //定义哈希桶(哈希结点数组)

 HashTable* CreatHashTable(); //创建哈希表
 int Hash(int key); //哈希函数(索引函数,可自定义)
 void Insert(HashTable* hashtable,int key, int val); //插入函数
 int Search(HashTable* hashtable,int TargetKey); //搜索函数
 void RemoveHashNode(HashTable *hashtable, int Targetkey);//删除键值对
 void DestoryHashTable(HashTable *hashtable);//摧毁已有的哈希表


int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
    HashTable *hashtable=CreatHashTable();
    for(int Count=0;Count<numbersLen;Count++){
        int IfExist=Search(hashtable,target-numbers[Count]);
        if(IfExist!=NoExist){
            *returnSize=2;
            int* Result=(int *)malloc(sizeof(int)*2);
            Result[0]=IfExist+1;
            Result[1]=Count+1;
            return Result;
        }
        else
            Insert(hashtable, numbers[Count], Count);
    }
    *returnSize=0;
    return NULL;
}

HashTable* CreatHashTable(){ 
    HashTable *hashtable=(HashTable *)malloc(sizeof(HashTable));
    hashtable->Buckets=(HashNode**)malloc(sizeof(HashNode*)*TableSize);
    for(int Idx=0;Idx<TableSize;Idx++)
        hashtable->Buckets[Idx]=NULL;

    return hashtable;
}

int Hash(int key){
    return key%TableSize>0?key%TableSize: -(key%TableSize);
}

void Insert(HashTable* hashtable,int key, int val){
    int Idx=Hash(key);
    HashNode* NewNode=(HashNode *)malloc(sizeof(HashNode));
    if(hashtable->Buckets[Idx]==NULL){
        NewNode->Next=NULL;
        hashtable->Buckets[Idx]=NewNode;
    }
    else{
        NewNode->Next=hashtable->Buckets[Idx];
        hashtable->Buckets[Idx]=NewNode;
    }
    NewNode->key=key;
    NewNode->val=val;
}

int Search(HashTable* hashtable,int TargetKey){
    /*当key在哈希表中存在时返回其在数字中的坐标
    否则返回-1表示不存在该值*/
    int Idx=Hash(TargetKey);
    HashNode *Temp=hashtable->Buckets[Idx];
    while(Temp!=NULL){
        if(Temp->key==TargetKey)
            return Temp->val;
        Temp=Temp->Next;
    }
    return -1;
}

void RemoveHashNode(HashTable *hashtable, int TargetKey){
    int Idx=Hash(TargetKey);
    HashNode *CurrNode=hashtable->Buckets[Idx];
    HashNode *PreNode=NULL;
    while(CurrNode->key!=TargetKey && CurrNode!=NULL){
        PreNode=CurrNode;
        CurrNode=CurrNode->Next;
    }
    //如果CurrNode==NULL说明无Target结点,无操作
    if(CurrNode!=NULL){
        PreNode->Next=CurrNode->Next;
        free(CurrNode);
    }
}

void DestoryHashTable(HashTable *hashtable){
    for(int Idx=0;Idx<TableSize;Idx++){
        if(hashtable->Buckets[Idx]!=NULL){
            HashNode *Temp=hashtable->Buckets[Idx];
            HashNode *Del=NULL;
            while(Temp!=NULL){
                Del=Temp;
                Temp=Temp->Next;
                free(Del);
            }
        }
    }
    free(hashtable->Buckets);
    free(hashtable);
}

全部评论

相关推荐

威猛的小饼干正在背八股:挂到根本不想整理
点赞 评论 收藏
分享
牛客263158796号:我领羊一面后十天不挂也不推进 今天问hr说等前序的第一批意向发完看情况再看是否推进
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务