目录
接触到力扣的第一题就跪了,验证了里面的高赞评论
回到题目
I 理解题目需求
1.在给定的数组中寻找数字A、B。
2.使A、B相加后结果等于目标数值C。
3.这两个数字是唯一的。
4.找到这两个数字之后需要输出这两个数字在数组中的位置。
5.使用模版代码
6.根据3个示例,我们可以发现,它输出的两个数字的位置都是连续的。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
}
分步理解这个模版:
(1)int* nums
在C语言中,int* nums
是一个声明,它表示 nums
是一个指向整数(int
)的指针。
具体地说:
int
:这是数据类型,表示整数。*
:这是一个指针修饰符,表示该变量是一个指针。nums
:这是变量的名称。
因此,int* nums
声明了一个名为 nums
的指针,该指针可以指向一个整数(int
)或整数数组的第一个元素。模版这里指的是定义了一个nums数组 等同于
int nums[] 。
(2)int numsSize
在C语言中,数组作为函数参数传递时会退化为指向其第一个元素的指针,因此你无法直接通过数组参数知道其大小(除非它是作为结构体的一部分传递,或者使用了其他方法,如传递数组大小作为单独的参数,或者使用标准库容器如std::vector
在C++中)。这就是为什么在上面的模版中,我们还需要一个单独的 numsSize
参数,目的是用来存储一个数组的元素数量。。
(3)int target
定义一个整数类型 target,里面放的是目标数值C。
(4)int* returnSize
在C或语言中,int* returnSize
的声明表示 returnSize
是一个指向整数的指针。然而,在函数声明的上下文中,这个指针通常被用作一个输出参数,用于在函数返回时传递某个值或数组的大小。
当函数需要返回多个值时,尤其是当其中一个值是动态分配数组的大小时,使用输出参数是一种常见的做法。returnSize
在这种情况下通常用于存储这个动态分配数组的大小,而函数本身可能返回一个指向该数组的指针。这里指的是返回值的个数。
所以根据上述的需求和条件,我们就可以开始设计程序了。
II 设计程序
一、我们需要定义两个整型的参数来代表数组中的两个数字。
int i=0;
int j=i+1;
j=i+1这样定义的目的是为了使程序不会找到两个一样的值。
二、在数组中查找一个数字的方法有:
1.使用for循环
2.使用while循环
3.使用二分查找
4.使用指针和递归
5.使用标准库函数
那么这里我们用最基本的方法——for循环,遍历整个数组并检查每个元素是否等于目标值。
设计for循环的时候还需要注意避免遍历的时候产生数组越界访问的问题。因此判断变量也需要相应的相差1。
for(int i = 0; i < numsSize - 1; i++)
{
for(int j = i+1; j < numsSize; j++)
{
}
}
三、判断遍历出来的两个数字相加是否等于target
使用if 来进行判断,使用 + 来进行相加。
if(nums[i] + nums[j] == target)
四、返回元素的位置(下标)
完成前4步,程序就能在数组中成功找到两个连续的、相加等于target的数字。找出来后我们需要一个新的数组来存放这两个下标。
参考代码:(来源慕雪年华)
int* twoSum(int* nums, int numsSize, int target,int* returnSize)
{
static int result[2] = {0};//static修饰后,return的地址才能被main接收
for(int i = 0; i < numsSize - 1; i++)
{
for(int j = i+1; j < numsSize; j++)
{
if(nums[i] + nums[j] == target)
{
result[0] = i;
result[1] = j;
*returnSize = 2;//这个不能删除
return result;
}
}
}
return NULL;
}
III 代码解析( 来源慕雪年华 )
因为我们需要在main函数里面使用result数组的值,所以需要用static来修饰这个数组
不用static修饰的话,出了自定义函数后,result数组的内存空间将被释放
即便我们return了这个数组,它也不能被主函数接收
(1)static的作用
1.修饰函数
2.修饰全局变量
3.修饰局部变量
这里使用的是static的第3个作用,将局部变量数组result,变成静态局部变量
即数组result不会在出自定义函数后销毁
(2)*returnSize是什么?
屏幕前的你是否和我有一样的疑惑,此*returnSize在自定义函数里面没有意义。
(3)那为什么不能删除?
要知道,这里的*returnSize是题目的模板给我们的
而且题目没有要求我们书写main函数
其实这里的*returnSize在main函数是有变量传过来的
删除后自定义函数里缺少变量来接受传过来的数据,自然会报错
*returnSize = 2;
同时,我们需要在if语句中将它定义为2,即为返回值的个数
在C语言中,一个数组的长度是不可知的。虽然本题中能明确数组的长度是2,但是在普遍情况下,如果我们需要在函数中给外层返回一个数组,那么就需要想办法让外层知道这个数组里面的元素数量是多少。returnSize是一个int*的指针,是传地址进来的,我们在函数中对returnSize解引用后的修改,可以被外层获取,这样就利用returnSize作为(输出型参数)让调用这个函数的执行流在调用完毕后能得知你返回的数组的大小。
C++中采用vector进行传参和返回,因为vector中已经封装了关于数组元素个数的记录,所以就不需要这个returnSzie变量了。