力扣数组刷题总结之c实现(常更)

1.int* returnSize问题:这个参数是用来保存返回的数组的长度的,对于刚刷数组的小伙伴需要注意,要给它赋值以返回数组的长度,不然是不可以的。

这里多提一下,关于数组作为形参调用函数时,为什么需要连同数组长度一起传进来?
这是因为数组作为参数传递的本质只是一个指针,也就是一个地址,编译器并不关心这个地址后边有多少有用数据,编译器只看得到指针所指的数据。所以在被调用函数中,无法直接知道这个数组的长度,所以当被调用函数想要使用数组长度时,最方便就是将数组长度作为形参传递进来,进而可以在传进来的数组的指针处依次往后读取数组长度个的数据。


那这就可以理解为什么要有returnSize这个指针了,主要是为了保存返回数组的长度,这样检验返回的数组的时候,最简单的操作:遍历数组,会用到数组的长度,c语言只给个数组起始地址,没办法确定输出多少个数据,这样会导致垃圾值输出,所以一般来说数组和数组的长度是成对出现的。

2.int** a 二维数组的问题:
例如:力扣的第120道题目
int minimumTotal(int** triangle, int triangleSize, int* triangleColSize)
对于力扣给的函数定义,简单说明一下:

triangle参数:是指存放二维数组每行的指针的数组 的指针,有点绕口,其实就是用一个指针去指向存放指针的数组,这主要是因为c语言中列数不等长的二维数组,可以通过先建立每行的数组,然后将每行数组的指针存放到一个新的数组里面,最后用一个指针来指向这个数组。
triangleSize:是指的二维数组的行数,也就是存放一维数组的指针的数组的长度。
triangleColSize:是指的存放每一行的列数的数组的指针。
只有传入这三个参数才可以去操作这个二维数组。

int a1[1] = {0};  //第一行
int a2[2] = {0};  //第二行
int a3[3] = {0};  //第三行
int *a[3] = {a1, a2, a3};  //指针数组
int **p;  //指向指针的指针
p = a;  //令该指针指向盛放二维数组每行的起始地址。

后面只需要将p、a[3]的大小、a[3]中的每个一维数组的长度放到一个数组里形成的数组,传到函数里面就可以了。

而至于访问二维数组中的元素通过p指针就可以了,如p[0][0]就是访问二维数组中的第一行第一列的元素。

因为力扣刷题是函数式编程的方式,相当于给你函数的定义,然后去实现这个函数,而函数中为了跑一些测试用例的方便,所以以指针的形式作为形参,这样直接修改原数据而指针不用改变。

3.反转数组:数组的反转,直接通过双指针解决就可以,初始左右指针分别指向数组起始和末尾,然后交换二者的值,然后移动左右指针即可,结束的条件是left不小于right。
4.数组循环移位:数组的循环移位的本质:移动K位的过程就是把数组的两部分交换一下。具体可以参考这道题目数组循环移位.

5.力扣刷题,本地测试的代码模板:
该模板适用于返回值为一维数组

int main()
{
	int returnSize = 0;
	int *a = &returnSize;
	int *b = your_function(para,..., a); //换成你的函数,参数等,a指向返回的数组的长度
	
	for(int i = 0; i < *a; i++)
    {
         printf("%d ", b[i]);
    }
}

该模板适用于传入参数为列数不同的二维数组

int main() {
     //二维数组每行的元素
     int a1[1] = {2};
     int a2[2] = {3, 4};
     int a3[3] = {6, 5, 7};
     
     //存放二维数组每行的起始地址的指针数组
     int *a[3] = {a1, a2, a3};
     
     //设置一个指针,指向存放各行指针的数组
     int **p;
     p = a;
     
     int pSize = 3; //二维数组的行数
     
     int columnSize[3] = {1, 2, 3};  //二维数组每行的列数
     
     int res = youfunction(p, pSize, columnSize);
     printf("%d", res);
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的贝塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值