力扣结题小思-1
虽然说也已经学习C语言很久的时间了,但是其实一直都不清楚自己的能力到底怎么样,那如何能够测试自己的代码能力呢,其实做题就是最方便的方式了,所以选择去试一试力扣中的编程题的难度怎么样,然后在做题的过程中到底能不能提高自己的代码能力,虽然说我也有点不太确定,但是这一点还是毋庸置疑的,只不过能与不能的区别只是在你做与不做之间,所以说什么也不用多说了,直接做就行了做了再说。一直都听到力扣的名字,但是虽然只是听说,却没有怎么去了解过,并且也没有尝试去做过,很多东西说实话我都是只是听过但是却没有尝试过,也总是会因为各种原因没有这个想法去尝试一下,不过现在的话号线好多了,有时候就是一个动念而已,并没有所谓的什么时候就应该做什么事情的规则,一旦打破了这个规则之后,其实自己可以活得更自由自在一些。然后还有一点值得注意的就是,也是非常得益于AI技术的发展,有时候自己不太清楚的知识,通过AI的解答其实大部分都能略知一二了,也是真的感受到这个工具的方便之处,如果没有这个工具,那么可能我就需要从其他的渠道来获取知识,那样的话其实还是挺麻烦的。回到主题还是,其实一直以来我对于代码都是比较陌生的,也没有那种意愿来提高自己的代码能力,但是现在其实是迫在眉睫了,但对于我来说也是一种机会,趁着这样的机会能够好好看看自己是几斤几两的水平。因为之前从来没有做过力扣的题目,所以还是从最简单的题目开始吧,其实一开始我连题目都看不懂,还是借助着AI工具才勉强看懂,下面就好好聊一下这个过程。
力扣热题100的第一题,也就是最简单的一道题,需要完成的是给一个整数数组和一个目标值,要从这个数组中找到两个数,加起来能够等于这个目标值,同时将这两个数的下标值进行返回,听起来好像是比较简单的,但是实际操作起来并不简单。我们先来看一下给出的题目形式是怎么样的,这里的代码编写框给到的是一个函数的形式,其中包括了函数的所有元素,就是没有函数的内部代码,所以其目的就是想要我们对这个函数进行填充,从而能够通过调用这个函数来完成所交代给我们的任务。总的来说就是要写一个符合要求的代码,这里先把这个函数框架贴出来。
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
}
乍一看好像还挺熟悉的,但是需要分析具体的构成才是真正的读懂题目,这里其实还挺好奇这里指数变量的书写习惯的,问了一下AI才明白这和一般的指数变量的书写只是在形式上不一样而已,实际上的效果是一样的,侧重点不一样而已,这其实也是有意思的地方,而且还有一点就是花括号的位置也不太一样,比如说一般情况下就是直接将花括号另起一行,而现在有很多地方就是直接在第一行就先填上花括号的左边,然后花括号的另一半放在下面,在现在的很多编译器中都是这样的。好了,回到主题上,先来分析一下这里的构成,先是这里的函数名是twoSum,而函数的返回值类型是指向整型的指针,这里注意返回值是指针类型,而一般函数的返回值都是非指针的,也就是函数最后面的return是指向整型的指针类型的,所以说在函数内部就需要定义对应的指针变量。然后在函数的输入参数中,有指向整型的指针变量也即nums,这个指针的作用是用来装载给定的整数数组的,一般可以通过将整数数组的数组名赋值给对应类型的指针变量,从而可以利用这个指针调用这个数组的成员值,然后是整型变量numsSize,其实也能想到这个就是给出的整数数组的大小,因为如果只有指向数组的指针的话,并不包含数组大小的这个信息的,然后是target也就是目标值,这个也是比较重要的,这个应该就是一个参照物吧,最后一个参数就是returnSize,这个变量的类型也是指向整型的指针,一开始我并不知道这个参数的意思,后面在查找AI之后才了解,这个其实是定义了返回数组的大小,因为其实返回的只是一个指针,并没有大小的这个概念,所以说也需要定义一个指针用来储存数组大小这个信息,这个和前面的numsSize这个变量的作用是一样的,但是有所不同的是,为什么要用到指针这个类型,这是因为这个变量代表着的是返回数组的大小,如果是一般变量的话,是达不到返回值的效果的,因为指针指向的那个变量的值,在函数结束调用之后依然存在,所以也就能作为返回数组大小的容器。下面就来简单地分析一下这题,顺便理清一下这道题的思路。
首先是可以定义一个数组将题目给出的数组给复制下来,也就是先定义在赋值或者说直接赋初值。但是后续发现这个思路其实不是很好实现,本来复制数组并不是一件那么容易的事情,而且其实如果直接使用给到的数组指针其实也不难。一般有两种使用方法,第一种方法是像数组一样使用中括号,第二种方法就是用符号对数组内容进行取值,所以就可以直接使用给定的指针。然后是准备一下需要的变量,因为这里要用到循环语句,需要对所有的情况进行遍历,而且是两个维度的遍历,所以需要两个变量,分别定义为i和j,同时为了保持符合条件的下标值,所以还需要定义两个变量,这里定义为x和y,当情况满足后,用于接收下标值,之后再进行循环,代码如下。
int i, j;
int x, y;
for (i=0;i<numsSize;i++)
{
for (j=i+1;j<numsSize;j++)
{
if (j==target-i)
{
x=i;
y=j;
break;
}
}
}
这样就得到了符合要求的下标x和y,那么下一步就是构造需要输出的数组,以及要将这两个变量给赋值给数组元素。这里需要重视的一点在于,函数中定义数组,特别是要输出或者说返回的数组,不能使用直接的方法,而是需要用malloc函数进行定义。这一点我也是后来才知道的,其实在提示中也说明了,当时我还不知道是什么意思。其实malloc函数就是为了能够给定义出来的数组分配内存的,因为一般情况下定义的数组起内存在函数调用之后会释放,而用malloc函数定义的就不会,所以需要在定义数组时用到malloc函数进行内存定义,以下为代码。
int result = (int) malloc (2 * sizeof(int))
简单解释一下就是,左边是对数组指针的定义,右边则是分配内存的过程,右边使用了malloc函数,而同时也用到了(int)用来表示左右类型的一致,而函数的参数就是分配内存的大小,因为这个数组包含两个元素,元素是int类型的,所以内存大小就是2*sizeof(int),这样就定义好了能够容纳两个元素的数组。接下来就是将得到的下标给到这个数组,同时需要对另一个指针进行说明,就是指针returnSize,这个指针指向一个整型变量,而这个整型变量的含义就是返回数组的大小,这里直接给2就行了,代码如下。
result[0]=x;
result[1]=y;
*retuenSize=2;
return result;
这样就将定义的数组给返回了,实际上返回的就是指针本身,同时一并返回的还有这个数组的大小,但是是以隐形的形式返回的,因为修改的是指针指向的变量,函数调用后依然没有消失,这样就完成任务了。最后也是顺利通过了,系统返回的结果是执行时间打败了30%,然后消耗内存打败了25%,可能我也不在乎性能有多厉害,重要的还是了解代码运行的整个过程,并且能从这个过程中学到一些以前不知道的东西,重要的是自己写的代码能实现相应的功能,当然也能通过调整让代码更好,但是目前来说并没有那个必要,就先这样吧。

浙公网安备 33010602011771号