鱼C论坛

 找回密码
 立即注册
查看: 945|回复: 6

[已解决]关于c语言中两个数组的普通的加法问题

[复制链接]
发表于 2023-7-6 21:16:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如图所示,为什么一直返回的是空数组啊 屏幕截图 2023-07-06 211255.png

网址:https://leetcode.cn/problems/two-sum/submissions/
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int a,b,c[2];
    for (a = 0;a<numsSize;a++){
        for(b=0;b<numsSize;b++){
            if (target == nums[a] + nums[b]){
                c[0] = a;
                c[1] = b;
                return c;
            
            }
        }
    }
    return 0;
}
最佳答案
2023-7-7 13:50:59
使用动态分配内存:
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    int a, b;
    int* c = (int*)malloc(2 * sizeof(int));
  
    for (a = 0; a < numsSize; a++) {
        for (b = 0; b < numsSize; b++) {
            if (target == nums[a] + nums[b]) {
                c[0] = a;
                c[1] = b;
                *returnSize = 2;
                return c;
            }
        }
    }
  
    *returnSize = 0;
    return NULL;
}
使用静态数组:
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    int a, b;
    static int c[2];
    
    for (a = 0; a < numsSize; a++) {
        for (b = 0; b < numsSize; b++) {
            if (target == nums[a] + nums[b]) {
                c[0] = a;
                c[1] = b;
                *returnSize = 2;
                return c;
            }
        }
    }
  
    *returnSize = 0;
    return NULL;
}
这两种版本的修改都会返回一个包含两个索引的整数数组,表示满足条件的两个数在原始数组中的位置。当没有找到符合条件的数对时,返回空指针,并将`returnSize`设置为0。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-6 21:17:35 | 显示全部楼层
这段代码的问题在于返回的是一个局部数组c的地址,而不是动态分配的内存空间。当函数结束后,局部数组c将被销毁,所以返回的地址将变得无效。

解决这个问题的方法是使用动态分配内存的方式来创建一个新的数组,并将结果存储在其中。修改代码如下:
int* twoSum(int* nums, int numsSize, int target, int* returnSize){    int a, b;    int* c = malloc(2 * sizeof(int)); // 动态分配内存空间    for (a = 0; a < numsSize; a++){        for(b = 0; b < numsSize; b++){            if (target == nums[a] + nums[b]){                c[0] = a;                c[1] = b;                *returnSize = 2; // 设置返回数组的大小                return c;            }        }    }    return NULL;}
在这个修改后的代码中,我们使用 malloc 函数动态分配了一个大小为2的整型数组,并将结果存储在其中。我们还通过 returnSize 参数将返回数组的大小传递给调用者。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 21:20:17 | 显示全部楼层
根据你提供的代码,有几个问题可能导致返回空数组:

返回类型错误:你的函数声明中指定了返回类型为 int*,这表示函数应该返回一个整数数组的指针。然而,在代码中,当找到目标和时,你直接返回了一个整数数组 c。这在编译时可能会导致类型不匹配的错误。你需要使用 malloc 分配内存来创建一个整数数组,并返回该数组的指针。调用者负责在使用完数组后调用 free 来释放内存。

数组越界:在你的代码中,你使用两个嵌套循环来遍历数组 nums 中的所有可能的组合。然而,在内部循环中,你的索引变量是 b,它可能会超出数组 nums 的有效索引范围。你应该将内部循环的起始条件改为 b = a + 1,这样可以避免重复计算相同的元素组合。

以下是经过修正的代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int a, b, *result;
    result = (int*)malloc(2 * sizeof(int)); // 分配存储结果的数组内存空间

    for (a = 0; a < numsSize; a++){
        for (b = a + 1; b < numsSize; b++){
            if (target == nums[a] + nums[b]){
                result[0] = a;
                result[1] = b;
                *returnSize = 2; // 更新返回数组的大小
                return result;
            }
        }
    }

    *returnSize = 0; // 如果没有找到满足条件的组合,将返回数组大小设为 0
    return NULL;
}
请注意,以上修正的代码假设调用者会在使用完返回的数组后调用 free 来释放内存,以避免内存泄漏。另外,你需要将调用 twoSum 函数的地方更新为使用返回数组的指针和大小,以便正确处理结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-6 22:26:18 | 显示全部楼层
鱼油代码中有几点可以改进:

  • 使用散列表(hash table)可以加速查找速度。我们可以构建一个散列表, key 为数组的值,value 为数组索引。这样,查找 target - x 的值的时间复杂度为 O(1)。
  • 直接返回散列表中的索引,不需要构建中间数组 c。 这可以减少内存使用和复制开销。
  • 需要注意边界条件,比如数组中有重复元素的情况。

改进后的代码如下:
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    *returnSize = 2;
    int *result = malloc(2 * sizeof(int));
    
    // 构建散列表
    int *hashTable = malloc(numsSize * sizeof(int));
    memset(hashTable, -1, numsSize * sizeof(int));
    
    for (int i = 0; i < numsSize; i++) {
        int complement = target - nums[i];
        if (hashTable[complement] != -1) {
            result[0] = hashTable[complement];
            result[1] = i;
            return result;
        }
        hashTable[nums[i]] = i;
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 22:32:36 | 显示全部楼层
不二如是 发表于 2023-7-6 22:26
鱼油代码中有几点可以改进:


?!是不是gpt?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-7 11:00:24 | 显示全部楼层
证明我是一个人类
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-7 13:50:59 | 显示全部楼层    本楼为最佳答案   
使用动态分配内存:
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    int a, b;
    int* c = (int*)malloc(2 * sizeof(int));
  
    for (a = 0; a < numsSize; a++) {
        for (b = 0; b < numsSize; b++) {
            if (target == nums[a] + nums[b]) {
                c[0] = a;
                c[1] = b;
                *returnSize = 2;
                return c;
            }
        }
    }
  
    *returnSize = 0;
    return NULL;
}
使用静态数组:
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    int a, b;
    static int c[2];
    
    for (a = 0; a < numsSize; a++) {
        for (b = 0; b < numsSize; b++) {
            if (target == nums[a] + nums[b]) {
                c[0] = a;
                c[1] = b;
                *returnSize = 2;
                return c;
            }
        }
    }
  
    *returnSize = 0;
    return NULL;
}
这两种版本的修改都会返回一个包含两个索引的整数数组,表示满足条件的两个数在原始数组中的位置。当没有找到符合条件的数对时,返回空指针,并将`returnSize`设置为0。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 08:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表