题解 | #两数之和#

两数之和

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);
}

全部评论

相关推荐

压力很大,面试官全程高压,问的问题不难,但是没有任何反馈,很慌张,也无算法。实习问了20分钟,一直问我你们做的有什么用,总时长一小时1.学校都有什么课程2.spring的ioc原理以及优点3.除了解耦还知道什么?4.springboot与spring区别,二者的源码看过没?Tomcat了解嘛?有没有具体看过5.spring的bean,面试官一直在重复一个思想问我懂不懂,完全没听过6.mybatis是干什么的?ibatis用过没?平常怎么写SQL?完全不写嘛?7.设计一个分布式双十一秒杀系统(前端,网关,缓存,数据库防超卖全设计)8.怎么做限流9.缓存与数据库一致性,你做异步要用户等你嘛?10.负载均衡怎么做11.多数据中心还是单数据中心,如果出现没卖完怎么做(到这完全不会了,面试官直接说换个话题吧)12.平常读书吗?13.上过哲学课嘛?14.兴趣爱好有没有15.对ai的看法16.来深圳有问题嘛?17.为什么不考研18.上大学带给了你什么?你提升在哪里,有没有具体的例子?反问:1.现在手机都有应用市场,应用宝怎么盈利?除了手机应用市场还是有人用,现在在做跨端,微软都有合作,之后会进军mac,主要做游戏,腾讯本身就是游戏大户。2.面试表现?整体评价一下会给到反馈。面完直接变HR面,今天HR面后,已经转为录用评估了,来牛客许个愿,暑期现在还没什么面试,希望能拿个offer之后再考虑要不要留在手子吧。
nunuking:三面压力这么大吗,面试的会议约了多长时间呀
面试问题记录
点赞 评论 收藏
分享
书海为家:实习是成为大厂正式员工很好的敲门砖,看您的简历中有一段实习经历,挺好的。我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己实习时做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务