【问题标题】:LeetCode: Two Sums (Error: Returning the Array)LeetCode:两个和(错误:返回数组)
【发布时间】:2019-12-16 16:57:00
【问题描述】:

我是 LeetCode 的新手,正在努力提高我的问题解决技巧。我正在尝试解决 C 中的二和问题,但在最终的 return 语句中遇到了麻烦。 LeetCode 最初提供给我的代码是一个名为“int* twoSum”的函数,其目标是在一个数组中找到产生目标数字的两个索引。该函数列出了几个我假设在 main 中提供的参数,因为它没有显示。

我将函数的名称更改为“int twosum”并删除了 int* returnSize,因为我不喜欢不必要的按地址而不是按值传递,并且觉得它不会产生重大影响。但是,在尝试运行我的代码后,我遇到了警告错误:“从返回类型为 'int' 的函数中返回 'int *' 会在没有强制转换的情况下从指针生成整数”

了解这个问题或之前在 LeetCode 上解决过该问题的人能否提供有关我需要更正的见解?谢谢。

int twoSum(int *nums, int numsSize, int target){

    int outerCount; //loop control variable for outer loop
    int innerCount; //loop control variable for inner loop
    int array[2]; //array that stores indices of numbers that produce target

    for(outerCount = 0; outerCount < numsSize; outerCount++)
        for(innerCount = outerCount + 1; innerCount < numsSize; innerCount++)
        {
            if(nums[outerCount] + nums[innerCount] == target)
            {
                array[0] = outerCount;
                array[1] = innerCount;
            }
        }

    return array;
}

【问题讨论】:

  • 您可以更改函数的签名吗?这个困境有很多解决方案。您可以使数组静态,或返回结构,或使用动态内存,或更改输入数组并使用它来返回值,etc...
  • 是的,您可以更改函数的签名。我见过一些与我类似的解决方案,但我似乎没有正确使用按地址返回数组。

标签: c arrays pointers


【解决方案1】:

问题要求您返回两个整数(索引),因此int 的返回类型显然是不正确的。 int 是单个整数;两个返回两个整数,您需要返回一个包含两个整数成员的intstruct 数组。 C 不允许你按值返回数组,所以如果你需要返回一个数组,你需要返回一个int*。 C 就是这样。

请注意,由于不能按值返回数组,因此也不能返回指向自动分配数组的指针,因为该对象的生命周期将在函数返回时结束。所以你需要动态分配数组(除非它作为参数传递给你的函数,这是一种非常常见的风格)。在这种情况下,根据注释,很明显需要动态分配的返回值:

/* Note: The returned array must be malloced, assume caller calls free(). */

无论你是否喜欢这种风格,你都需要在这个练习中遵守它,因为很明显,调用者将在返回的指针上调用free(),并在不是最初的指针上调用free() malloc 返回的是未定义的行为(很可能会导致程序崩溃)。 (你可以free(NULL),但这也违反了调用合约,当调用者试图检查不存在的返回值时会出现段错误。)

C 确实允许您按值返回 structs,但如果您要返回 struct,则您和调用者需要就其声明达成一致(例如,其成员的名称)。

【讨论】:

  • 所以对于我上面的程序,如果我仍然想通过数组的地址传递而不是使用结构(我还没有学过,但现在要练习),我该怎么做关于这样做?这是给定的函数定义行: int* twoSum(int* nums, int numsSize, int target, int* returnSize){ 我相信 int* nums 是给定的测试用例数组,returnSize 是数组的索引。由于该函数不是 void,因此我不确定要返回什么,因为所有内容都是通过地址传递的。
  • @africanmamba:leetcode 几乎总是期望返回的数组是动态分配的;此外,它通常为您提供一个“out”参数来返回返回数组的大小。 (C 不提供具有显式长度的数组类型。在这种特殊情况下,返回数组的长度必须为 2,因此您将 (1) 首先使用 int *indices = malloc(2*sizeof * indices); (2) 分配一个二元素数组,然后然后在你找出正确的值后,返回它们:`*returnSize = 2; return indices;
猜你喜欢
  • 2021-12-22
  • 1970-01-01
  • 2015-01-19
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多