LeetCode第一题Two Sum:为何必须设置returnSize为2?
LeetCode Two Sum中returnSize参数的作用及报错原因
我正在用C语言解决LeetCode第1题Two Sum,题目要求给定整数数组
nums和整数target,返回两个数的下标使它们的和等于target,输入恰好有一个解且不能重复使用同一元素。我写的代码如下:
/** * Note: The returned array must be malloced, assume caller calls free(). */ int* twoSum(int* nums, int numsSize, int target, int* returnSize) { *returnSize = 2; /* here */ int* result = (int*)malloc(2 * sizeof(int)); for (int i = 0; i < numsSize; i ++) { for (int j = i + 1; j < numsSize; j ++) { if (nums[i] + nums[j] == target) { result[0] = i; result[1] = j; return result; } } } return NULL; }我发现如果不设置
returnSize或者把它设为2以外的值,提交就会报错,但看起来returnSize和返回值无关,想知道原因。
核心原因:returnSize是给评测系统的输出参数
LeetCode的C语言题函数签名里,returnSize的作用是让你告诉调用者(也就是后台评测系统)你返回的动态分配数组的元素个数。
C语言的限制导致必须用这种方式传递长度
C语言中,函数返回的指针只指向数组的起始地址,调用者无法直接通过指针得知数组的长度。所以LeetCode设计了这个指针参数,要求你把返回数组的长度写入*returnSize,供评测系统读取。评测系统依赖这个值处理结果
对于Two Sum题,题目保证恰好有一个解,所以你返回的数组一定包含2个下标。评测系统会读取*returnSize的值,然后根据这个值去取你返回数组里的元素:
- 如果你没设置
*returnSize,它的值是未初始化的垃圾值,评测系统读取时会出现未定义行为(比如读取错误长度的元素,导致结果校验失败); - 如果设为2以外的值(比如1),评测系统只会读取数组的前1个元素,无法拿到完整的两个下标,自然会判定答案错误。
- 提前return也要先设置
returnSize
哪怕你在循环里找到结果就直接return,也必须先设置*returnSize = 2。因为评测系统可能在检查返回数组之前,先验证returnSize的合法性,或者依赖它来分配内存、读取数据,未正确设置的话必然触发报错。
简单来说,returnSize是你和评测系统之间的约定:你返回的数组有多长,必须通过这个参数明确告知,否则系统无法正确处理你的返回结果。
内容的提问来源于stack exchange,提问作者HELLOQWORLD1
相关产品推荐
相关产品推荐

