LeetCode C 中的二和问题。请帮我指点一下

问题描述 投票:0回答:1

我是 LeetCode 的新手,我在 C 方面的唯一背景是其基础知识的一类。我希望能够进步并了解更多。请帮助我解决这个问题。我认为我的问题在于指针或 malloc。我不知道这里出了什么问题以及如何解决。

这是我的代码:

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

    for(int i=0; i<numsSize; i++){
        for(int j=i++ ; j<numsSize; j++){
            if( nums[i] + nums[j] == target ){
                ans[0] = i;
                ans[1] = j;
                break;
            } 
        }
    }
    return *ans;
}

这是错误:

第 207 行:字符 3:运行时错误:加载类型“int”的未对齐地址 0x000000000001,需要 4 字节对齐 [Serializer.c] 0x000000000001:注意:指针指向这里

据我对指针的理解:

  • *ans[0] = i
    应该将 i 的值(一个整数)赋给指针 ans[0] 指向的值。但是,这会给出错误“错误:一元‘*’的类型参数无效(有‘int’)”。所以,我尝试了上面的代码。
  • 'return *ans' 应该返回数组 [i,j]???

所以,我需要的帮助是更多地了解指针。非常感谢!

c pointers malloc
1个回答
1
投票

如果 C 中有一个指针

int* ptr
,您可以使用运算符
*
(如
*ptr
)取消引用它(获取它所指向的对象)。或者,如果为多个对象分配了内存(例如通过
malloc()
),您可以使用
*(ptr + i)
获取每个对象,其中
i
代表您要检索的对象的偏移量。但是,如果
i
为负数或大于/等于您为其分配内存的对象数量,则您将超出边界访问内存,这是未定义的行为,并可能导致分段错误。

由于写

*(ptr + i)
有点难看且难以阅读,您可以使用
ptr[i]
代替,它的作用是一样的。


*ans[0] = i
应该分配 i 的值

您可以使用

*ans = i
*(ans + 0) = i
ans[0] = i
来获得工作结果。所有这三个选项的作用都是相同的,但我更喜欢最后一个,因为您有一个数组,而不仅仅是指针指向的单个元素。 (如果它只是一个,你应该使用
*ans
以便于阅读和理解它不是一个数组。)

return *ans
应该返回数组 [i,j]

同样的问题又来了。当您像

*ans
那样取消引用它时,您不会返回整个数组,而只会返回它指向的第一个对象,即整数
i
。相反,你应该
return ans;

在内部

for
循环中,您使用
int j=i++
,它将
j
设置为
i
,然后将
i
加 1。这不是您想要的行为,因为它会使
i
跳过整个迭代,这可能导致您跳过您正在寻找的值。对于第一次迭代,
i
j
是相同的,但 问题 表明情况不应该如此。所以你可以在你的内部
int j = i + 1
循环中使用
for


您的其余代码应该可以工作,但可以稍微改进。我想您想在

for
中的
break
语句中退出两个
if
循环?
break
仅存在内部循环,这不会给您带来错误的结果,因为问题描述指出“仅存在一个有效答案”,但您可以直接
return ans;
立即退出。否则,您可以使用一些附加变量或
goto
跳转到函数末尾。

并且您不会检查

malloc()
返回给您的内容。如果它返回
NULL
(尽管这可能不会发生),那么当您尝试取消引用
ans
时,您的程序将崩溃。


这个问题并没有说明如果你没有找到一对有效的答案应该发生什么,但我认为“只有一个有效的答案存在”意味着总是有一个有效的答案,不多也不少。我假设我的解决方案可能找不到一对,并且仅分配

ans
并将
*returnSize
设置为
2
如果我确实找到了一个。

int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    *returnSize = 0;

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

    return NULL;
}
© www.soinside.com 2019 - 2024. All rights reserved.