在 Leetcode 的“两和”问题中,为什么我们必须 *returnSize=2;用 C 语言?

In the "Two Sum" question in Leetcode, why do we have to *returnSize=2; in C language?

提问人:rachelle 提问时间:6/27/2023 最后编辑:Gerhardhrachelle 更新时间:6/27/2023 访问量:214

问:

示例 1:

    Input: nums = [2,7,11,15], target = 9 <br>

    Output: [0,1] <br>

解释:因为 nums[0] + nums[1] == 9,我们返回 [0, 1]。

示例 2:

    Input: nums = [3,2,4], target = 6 <br>

    Output: [1,2] <br>

示例 3:

    Input: nums = [3,3], target = 6 <br>

    Output: [0,1] <br>

约束:

    2 <= nums.length <= 104
    -109 <= nums[i] <= 109
    -109 <= target <= 109
    Only one valid answer exists.

这是我设法从解决方案和 youtube 获得的代码:

  /**
    * Note: The returned array must be malloced, assume caller calls free().
    */
    int* twoSum(int* nums, int numsSize, int target, int* returnSize) { 

    //uptil here, it is given

    int *returnArr=malloc(2 * sizeof(int));
    *returnSize=2; //WHY
    int i,j;
    for(i=0;i<numsSize-1;i++){
        for(j=i+1;j<numsSize;j++){
            if(nums[i]+nums[j]==target){
                returnArr[0]=i;
                returnArr[1]=j;
               return returnArr; //gets out of loop if we encounter return so program is faster if       return is here too;
            }
        }
    }
    return returnArr; //here return returnArr is mandatory;
}

所以 stackoverflow 告诉我我应该在这里包含非代码文本,它不允许我在没有它的情况下发布,而且我花了很多时间缩进代码,所以是的,这是有效的解决方案代码并提供正确的输出,但我只想知道为什么我们必须放置以及为什么我们不能像 - 为什么 leetcode 暗示它应该被错位?*returnSize=2;returnArrint returnArr[100];

我可以不声明函数中的元素吗?这些元素可以不发送到 main 函数吗?但是在这里,它只是返回数组的值,而不是数组本身? 但即便如此,我们不能返回数组吗?

P.S. 我是一个已经学习(未掌握)DSA 的初学者,我花了很多时间试图理解,但觉得我在浪费时间:(

数组 C 指针 malloc

评论

0赞 Gerhardh 6/27/2023
欢迎来到 SO。只是预先说明:对于您的主要问题,所有这些示例都无关紧要。
0赞 Gerhardh 6/27/2023
您应该重新访问您的 C 教科书或其他学习材料,并查看有关变量定义、范围和生存期的章节。如果在函数中将数组定义为局部变量,则在函数离开后,该数组将停止存在。返回其地址将导致使用无效的指针。
0赞 Gerhardh 6/27/2023
这回答了你的问题吗?错误:函数返回局部变量的地址
0赞 Vlad from Moscow 6/27/2023
@rachelle 目前尚不清楚该函数是否必须找到所有等于目标数之和的对,或者只找到第一个这样的对。

答:

0赞 Eric Postpischil 6/27/2023 #1

为什么我们必须 *returnSize=2;用 C 语言?

您必须返回数组中的元素数,因为调用方需要它。*returnSize

(a) Leetcode 没有在问题页面上说明此要求,这是 Leetcode 的质量问题

(b) 这一要求没有理论上的理由;由于此问题中的返回大小固定为两个元素,因此显式返回它不会获得任何信息。返回大小可能符合 Leetcode 中的常见模式,该模式用于解决返回大小不固定的其他问题。

为什么我们不能像 int returnArr[100] 一样声明一个数组 returnArr;- 为什么 LeetCode 暗示它应该被恶意定位?我可以不声明函数中的元素吗?

在函数内部声明时,声明的对象具有自动存储持续时间。这意味着从与声明关联的程序执行到包含声明的代码块的执行结束,都会为其保留内存。该执行将在函数返回时或更早结束。然后,内存不再保留给对象,并且可以将其重新用于其他目的。因此,此函数的调用方不能依赖于可用的内存。实际上,在函数中声明时,不能将其返回到调用函数。int returnArr[100];int returnArr[100];

这些元素可以不发送到 main 函数吗?

不,不可靠。

但是在这里,它只是返回数组的值,而不是数组本身?

该语句不返回数组。当数组在 C 表达式中使用,而不是用作 的操作数,而不是作为 的操作数,或者用作用于初始化数组的字符串文字时,它会自动转换为指向其第一个元素的指针。其实也是.它返回指向用于 的内存的指针。但是,如上所述,此内存不会保留给函数返回后,因此指针将失效。return returnArr;sizeof&return returnArr;return &returnArr[0];returnArrreturnArr

但即便如此,我们不能返回数组吗?

不。