力扣刷题之旅——1.两数之和

目录

I 理解题目需求

(1)int* nums

(2)int numsSize

(3)int target

(4)int* returnSize

II 设计程序

一、我们需要定义两个整型的参数来代表数组中的两个数字。

二、在数组中查找一个数字的方法有:

三、判断遍历出来的两个数字相加是否等于target

四、返回元素的位置(下标)

III 代码解析( 来源慕雪年华 )

(1)static的作用

(2)*returnSize是什么?

(3)那为什么不能删除?


接触到力扣的第一题就跪了,验证了里面的高赞评论

回到题目


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变量了。
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值