laozizuiniu8 2023-11-29 20:32 采纳率: 60%
浏览 19

力扣第一题哈希表VS2022能跑,官网上跑不了

今天刷leedcode第一题做哈希表就出问题了,在VS上进行补全能跑,但leedcode上跑不了

typedef struct hashsable
{
    int key;
    int val;
    UT_hash_handle hh;
} hashTable;
hashTable* hashtable;
hashTable* hashtable_find(int key)
{
    hashTable* ret ;
    ret = (hashTable*)malloc(sizeof(hashTable));
    HASH_FIND_INT(hashtable, &key, ret);
    return ret;
}
void hashtable_add(int ikey, int i)
{
    hashTable* news = hashtable_find(ikey);
    if (news == NULL)
    {
        news = (hashTable*)malloc(sizeof(hashTable));
        news->key = ikey;
        HASH_ADD_INT(hashtable, key, news);
    }
    else
    {
        news->val = i;
    }
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
    int* reta ;
    reta = (int*)malloc(sizeof(int) * 2);
    for (int i = 0; i < numsSize; i++)
    {
        int ikey = target - nums[i];
        if (hashtable_find(ikey) != NULL)
        {
            reta[0] = i, reta[1] = hashtable_find(ikey)->val;
            return reta;
        }
        hashtable_add(nums[i], i);
    }
    *returnSize = 0;
    return NULL;
}

  • 写回答

3条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-11-29 20:43
    关注

    所有内容均由人工智能模型输出,其内容的准确性和完整性无法保证,不代表我的态度或观点。

    该回答引用ChatGPT-3.5,仅为您提供参考,不保证完全正确
    您好!看起来您使用了 Brian Kernighan 在《The C Programming Language》中提到的经典的哈希表实现方法,这是一个不错的选择。


    首先,让我们检查一下可能导致在LeetCode上运行失败的问题。有几个潜在的原因:

    1. 内存泄漏: 您在 hashtable_find 中分配了内存,但未在函数结束时释放。这可能导致内存泄漏。您应该在 hashtable_find 函数中释放 ret

    2. 返回空指针: 如果哈希表中没有找到对应的项,hashtable_find 返回 NULL。在 twoSum 函数中,如果没有找到匹配的项,您返回了一个未初始化的指针 reta,这可能导致未定义的行为。在这种情况下,最好将 returnSize 设置为0并返回 NULL

    3. 头文件包含: 确保您在代码中包含了哈希表库的头文件,以便LeetCode系统可以正确解析它。在您的代码中,UT_hash_handleHASH_FIND_INT 是来自 "uthash.h" 头文件的。

    为了解决这些问题,您可以尝试以下修改:

    #include <stdlib.h>
    #include "uthash.h" // 确保正确包含哈希表库的头文件
    
    typedef struct hashsable {
        int key;
        int val;
        UT_hash_handle hh;
    } hashTable;
    
    hashTable* hashtable;
    
    hashTable* hashtable_find(int key) {
        hashTable* ret;
        HASH_FIND_INT(hashtable, &key, ret);
        return ret;
    }
    
    void hashtable_add(int ikey, int i) {
        hashTable* news = hashtable_find(ikey);
        if (news == NULL) {
            news = (hashTable*)malloc(sizeof(hashTable));
            news->key = ikey;
            news->val = i; // Initialize val when adding a new entry
            HASH_ADD_INT(hashtable, key, news);
        } else {
            news->val = i;
        }
    }
    
    int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
        int* reta = (int*)malloc(sizeof(int) * 2);
    
        for (int i = 0; i < numsSize; i++) {
            int ikey = target - nums[i];
            hashTable* entry = hashtable_find(ikey);
            if (entry != NULL) {
                reta[0] = i;
                reta[1] = entry->val;
                *returnSize = 2;
                return reta;
            }
            hashtable_add(nums[i], i);
        }
    
        *returnSize = 0;
        free(reta); // Free memory if no solution is found
        return NULL;
    }
    

    这些修改应该能够提高代码的稳定性和可读性,并在LeetCode上正确运行。如果仍然存在问题,请检查LeetCode的错误信息以获取更多详细信息。


    该回答引用NewBing,仅为您提供参考,不保证完全正确
    您好,这是Bing。我看到您在力扣上遇到了一些问题,我会尽力帮助您。😊


    根据我的搜索结果,您的代码中可能存在以下问题:

    • 您的结构体名字拼写错误,应该是hashTable而不是hashsable
    • 您的hashtable_find函数中,不需要为ret分配内存,只需要声明一个指针即可。
    • 您的hashtable_add函数中,如果news不为空,应该更新news->vali,而不是news->val = i
    • 您的twoSum函数中,如果找到了两个数,应该将*returnSize赋值为2,而不是0

    我为您修改了一下代码,您可以尝试在力扣上运行一下,看看是否能通过测试:

    typedef struct hashTable
    {
        int key;
        int val;
        UT_hash_handle hh;
    } hashTable;
    hashTable* hashtable;
    hashTable* hashtable_find(int key)
    {
        hashTable* ret;
        HASH_FIND_INT(hashtable, &key, ret);
        return ret;
    }
    void hashtable_add(int ikey, int i)
    {
        hashTable* news = hashtable_find(ikey);
        if (news == NULL)
        {
            news = (hashTable*)malloc(sizeof(hashTable));
            news->key = ikey;
            news->val = i;
            HASH_ADD_INT(hashtable, key, news);
        }
        else
        {
            news->val = i;
        }
    }
    int* twoSum(int* nums, int numsSize, int target, int* returnSize)
    {
        int* reta ;
        reta = (int*)malloc(sizeof(int) * 2);
        for (int i = 0; i < numsSize; i++)
        {
            int ikey = target - nums[i];
            if (hashtable_find(ikey) != NULL)
            {
                reta[0] = i, reta[1] = hashtable_find(ikey)->val;
                *returnSize = 2;
                return reta;
            }
            hashtable_add(nums[i], i);
        }
        *returnSize = 0;
        return NULL;
    }
    

    源: 与必应的对话, 2023/11/29
    (1) 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台. https://leetcode.cn/.
    (2) 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台. https://leetcode.cn/problemset/all/.
    (3) LeetCode第一题:两数之和 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/341422905.
    (4) 力扣算法之哈希表_力扣哈希表-CSDN博客. https://blog.csdn.net/qq_43569680/article/details/123967735.
    (5) leetCode. 哈希表专题(1) - 知乎. https://zhuanlan.zhihu.com/p/58839353.


    该回答引用文心大模型3.5,仅为您提供参考,不保证完全正确
    你在使用LeetCode平台时遇到的问题可能是由于LeetCode的C语言环境并没有自带你所使用的哈希表库(utarray.h)导致的。


    在你的代码中,你使用了UT_hash_handle来实现哈希表,这是UTarray库的一部分。UTarray库是一个通用的数组库,提供了一些额外的功能,比如动态数组、数组排序等。


    LeetCode平台并不自带这个库,所以在LeetCode上运行你的代码时会出现错误。


    你可以尝试以下几种解决方法:

    1. 自行实现哈希表:你可以自己实现一个简单的哈希表,而不是使用UTarray库。这可能需要一些额外的工作,但可以帮助你更好地理解哈希表的工作原理。
    2. 使用标准库中的数据结构:C语言的标准库提供了一个叫做unordered_map的数据结构,你可以使用它来代替你的哈希表。这个数据结构提供了类似的功能,但使用起来可能稍微有些不同。
    3. 请求LeetCode平台支持UTarray库:你也可以向LeetCode平台提交一个请求,希望他们能够支持UTarray库。但是,这可能需要一些时间,而且并不保证一定会被接受。

    以下是使用标准库中的unordered_map来实现你的代码的示例:

    #include <unordered_map>
    #include <vector>
    
    using namespace std;
    
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hashTable;
        vector<int> ret;
        for (int i = 0; i < nums.size(); i++) {
            int ikey = target - nums[i];
            if (hashTable.find(ikey) != hashTable.end()) {
                ret.push_back(i);
                ret.push_back(hashTable[ikey]);
                return ret;
            }
            hashTable[nums[i]] = i;
        }
        return {};
    }
    

    以上代码直接使用了C++的标准库中的unordered_map来实现哈希表,并且在其中存储了每个元素的值和它在数组中的索引。在遍历数组的过程中,如果找到目标值的另一个元素,就直接返回两个元素的索引。如果遍历完整个数组都没有找到目标值的另一个元素,就返回一个空的数组。


    该回答引用讯飞星火认知大模型,仅为您提供参考,不保证完全正确
    你好,根据你的描述,你在LeetCode上遇到了问题。这个问题可能是由于你没有正确地初始化哈希表导致的。在C语言中,你需要使用HASH_INITIALIZE32函数来初始化哈希表。请尝试在你的代码中添加以下内容:

    #include <uthash.h>
    
    int main() {
        hashTable* hashtable = NULL;
        HASH_INITIALIZE32(hashtable);
        // 其他代码...
        return 0;
    }
    

    这将初始化一个空的哈希表,然后你可以继续使用你的hashtable_findhashtable_add函数。希望这可以解决你的问题。


    该回答引用通义千问大模型,仅为您提供参考,不保证完全正确
    看起来您的代码没有错误。可能的问题是LeetCode的运行环境与您的本地环境有所不同。


    在LeetCode上,您不能直接使用#include <ut_hash.h>,因为LeetCode的环境中可能并没有包含这个库。因此,您需要将所有涉及到UT_hash.h的部分替换为手动实现的哈希表操作,例如插入、查找和删除等。


    另外,请注意LeetCode上的内存管理规则。一般来说,LeetCode会自动为您处理内存管理,您不需要手动调用mallocfree。如果您在代码中使用了这些函数,可能会导致LeetCode的测试用例失败。


    最后,请确保您的代码符合LeetCode的输入输出格式要求。如果您的返回值不正确或者没有按照指定的方式打印结果,那么您的提交将会被判定为错误答案。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月29日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见