【问题标题】:How to use the malloc() function in order to return an array?如何使用 malloc() 函数返回一个数组?
【发布时间】:2021-01-12 17:23:11
【问题描述】:

我正在尝试解决这个问题:

给定一个整数数组 nums 和一个整数目标,返回这两个数字的索引,使它们相加为目标。

您可以假设每个输入都只有一个解,并且 您不能两次使用相同的元素。

您可以按任意顺序返回答案。

Example 1:
 
 Input: nums = [2,7,11,15], target = 9 Output: [0,1] Output: Because
 nums[0] + nums[1] == 9, we return [0, 1].

我的代码是:

    /**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
*returnSize = malloc (2 / sizeof(int));
for (int i=0; i<numsSize; i++)
{
    for (int j=0; j< numsSize; j++)
    {
        if (i != j)
        {
           if(nums[i] + nums[j] == target)
           {
               returnSize[0] = i;
               returnSize[1] = j;
           }
        }
    }
}
    return returnSize;
}

如您所见,他们在代码开头添加了注释以给出提示,但我不知道我应该如何在这里使用 malloc() 函数以及确切的原因。 如您所见,我尝试使用 malloc() 函数添加第一行,这只是我在网上阅读的内容并认为这会有所帮助,因为我认为它为数组分配了 2 个可用空间,这意味着我'将有足够的内存和空间在其中插入 2 个整数。 但它不起作用。

我很高兴听到我应该如何以及出于什么原因在这里使用 malloc 函数, 谢谢。

【问题讨论】:

  • 你需要乘,而不是除。
  • 2 / sizeof(int) 将导致0,因为sizeof(int) 可能是4 或8。正如tkausl 所说,您需要在这里相乘。
  • 旁白:您可以通过在 i+1 而不是 0 开始 j 来加快代码速度。这也会使 i != j 测试变得多余。您还可以在为目标值的第一个匹配项填充数组后立即返回指向该数组的指针,而不是继续循环以查找其他匹配项。
  • @IanAbbott 谢谢,你是对的。我认为从 i+1 开始 j 会取消可能的匹配,这就是为什么我需要从 0 开始运行以覆盖整个数组。关于您的第二个提示,您是在谈论在第二个循环中添加“return returnArray”以便它立即返回值吗?
  • 是的,在returnArray[0] = i;returnArray[1] = j;之后,可以加return returnArray;直接返回。您仍然需要在函数末尾添加return,但只有在没有匹配项时才能达到。 (您可以做一些事情来表明没有找到匹配项,例如将数组元素设置为 -1 或释放内存并返回 NULL。)

标签: arrays c loops integer malloc


【解决方案1】:

不允许在函数体顶部声明与参数同名的局部变量。你应该给另一个名字。

而且分配大小是错误的。大小应该是(元素的数量)乘以(一个元素的大小)。

最后我猜想返回的数组中有效元素的数量应该写到returnSize所指向的地方。

试试这个:

int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int *returnArray = malloc (2 * sizeof(int));
    for (int i=0; i<numsSize; i++)
    {
        for (int j=0; j< numsSize; j++)
        {
            if (i != j)
            {
               if(nums[i] + nums[j] == target)
               {
                   returnArray[0] = i;
                   returnArray[1] = j;
               }
            }
        }
    }
    *returnSize = 2;
    return returnArray;
}

【讨论】:

  • 非常感谢迈克。有用。我的问题是:(1)如果我们甚至不使用它,为什么我们需要设置 *returnSize?我的意思是我们声明 returnArray 并返回它。如果我们已经知道数组的大小(即 2,这就是我们在 malloc 函数中写 2 的原因),为什么还需要 returnSize? returnSize 指针对我们有什么贡献?
  • (2) 知道returnArray的大小为什么还要使用malloc函数?我的意思是我们已经知道,基于这个问题,答案应该只包含 2 个索引。那么为什么我们不能只声明一个包含 2 个参数的新数组呢?像 int array[2] 这样的东西。我知道这在 C 语言中是不允许的,但我的意思是这有点愚蠢,你不觉得吗?我们从字面上知道数组的大小,仍然需要使用 malloc 函数。
  • (3) 为什么函数的输出是 [1,0] 而不是 [0,1] 基于以下输入:nums = [2,7,11,15] & target =9。我的第一个循环通过 (i) 运行,这意味着数组中的第一个参数,即 2。和 (j) 在其他参数上运行。这意味着当我找到匹配项 (2+7) 时,“i”将为“0”(因为 2 是数组中的第一个参数),“j”将为“1”(因为 7 是第二个数组中的参数)。然后我先把 i 然后 j 在 returnArray 中。所以它应该是 [i,j] 因此 [0,1] 但我的代码的输出是 [1,0]
  • (1), (2) 这应该是因为服务提供者不想为预期固定大小数组的问题创建和维护单独的检查器,并使用常见的检查器来解决数组长度问题返回的答案各不相同。此外,即使我们使用的不仅仅是判断系统,而是独立的问题,返回int array[2]; 也是不好的,因为它会在从函数返回时失效。返回static int array[2]; 可能没问题,但是当您使用多个线程或想要维护多个调用的结果时要小心。
  • (3) 因为i = 1, j = 0 的搜索晚于i = 0, j = 1 并且返回的数组被后面找到的答案覆盖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2017-07-30
  • 2016-05-27
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多