这个题的思路很简单,但是如果用C语言来写的话,代码理解还是有一些难度的。
在力扣上,这道题给的接口如下:
我第一次在力扣上完成二维数组的题的时候,看见这些参数也是一脸懵,下面我来解析一下。
(1)int* original —— 这是题目给的数组。
(2)int originalSize —— 这是数组 original 的大小。
(3)int m, int n —— 这时所要化成二维数组的行和列。
(4)int * returnSize —— 这是通过指针的形式返回二维数组的行数。你可以想象在main函数中,将一个数的地址传到该函数中,你的任务就是把二维数组的行数赋值给 returnSize 所指向的空间,从而通过传址的方式改变main函数中的值。
(5)int** returnColumnSizes —— 这是一个二级指针,这个题想让你把二维数组每一行的元素也返回去,如果有m行,那么就要返回m个值,所以需要以一个一维数组的形式将它返回去。你可以这样想象,想让这个函数返回一个一维数组到mian函数中,你第一时间想的肯定是在main函数中将一个一维数组的地址传进该函数中,但是这样肯定是不行的。因为你不知道二维数组有多少行,也就是说你不知道这个一维数组有多大。所以你只能传一个一级指针的地址到该函数中,在这个函数中需要拿一个二级指针来接收。你需要完成的任务就是在该函数中根据二维数组的行数,为这个一级指针开辟一块儿空间 即:
*returnColumnSizes = (int *) malloc (sizeof(int)* m);
然后,给这个空间里面赋值。(操作很简单,不在进行讲述)
接下来我们再说一说如何返回一个二维数组吧。
(1)如果直接在函数中定义一个二维数组,最后将它返回,这样写对吗?很显然这样不对,因为在该函数中定义一个二维数组是在栈区开辟的一块儿空间,只要走出了这个函数,这块儿空间就会被释放掉。所以我们不能在栈区开辟空间,要在堆区开辟空间,即通过malloc,calloc,realloc。
(2)首先我们需要定义一个二级指针(二维数组名),进行第一次空间开辟,所开辟的空间是用来存放一级指针(一维数组即每一行的地址),开辟如下:
int**arr=(int**)malloc(sizeof(int*)*m);
(3)下来我们要进行第二次空间开辟,这次开辟是为一级指针开辟空间,用来存放每一行的元素,所以有m行,就要开辟m次,每一次的开辟如下:
arr[i]=(int *)malloc(sizeof(int)*n);
这道题完整代码,如下:
int** construct2DArray(int* original, int originalSize, int m, int n, int* returnSize, int** returnColumnSizes) { int count=0; if(m*n!=originalSize) return NULL; int**arr=(int**)malloc(sizeof(int*)*m); *returnSize=m; *returnColumnSizes=(int*)malloc(sizeof(int)*m); for(int i=0;i<m;i++) { arr[i]=(int *)malloc(sizeof(int)*n); (*returnColumnSizes)[i]=n; } for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { arr[i][j]=original[count]; count++; } } return arr; }