相信初次刷力扣的同学经常会因为题目所给的参数看不懂,导致从入门到入土,例如下面这个题目,相信有一些同学已经汗流浃背了。
不过没有关系今天写这个文章就是为了解决这个问题,让大家更好的融入力扣大家庭(上头上头?)。
首先我先给出我的题目来源,这个变量算比较复杂的,所以也比较有代表性。
那我们开始咯(yeyeye):
int** matrix
int matrixSize
int* matrixColSize
int* returnSize
int** returnColumnSizes
在刷题的时候题目一定要好好看这种信息也不能放过。
翻译如下:
/**
*返回一个大小为*returnSize的数组数组。
*数组的大小以*returnColumnSizes数组的形式返回。
*注意:返回的数组和*columnSizes数组都必须进行mallocated,假设调用者调用free()。
*/
看到这里相信有些朋友就有些想法了吧(没有也没有关系,我会给你将清楚的)
这个就是题目给我们的待转置的数组
int* matrix[2]
int main()
{
int a[3] = { 1,2,3 };
int b[3] = { 4,5,6 };
int* matrix[2] = { a,b };
}
这个比较简单大家也都能理解故我们直接下一个。
特别注意很多同学(还有我,吐了🤮)可能会因为它的英文而想当然,以为它是整个数组的元素个数,其实它是数组的行数!!!,至于为什么人家就是这么设定的
这个就和它的英文名一样,指的是题目给定数组的列数,不过使用指针来传递的,用的时候记得解引用。
因为前面有个return所以不难想到,它是要我们返回的(也就是我们求的),后面的Size和前面的matrixSize大同小异,都不是指总元素个数而是行数。
压轴出场是有道理的,相信许多朋友距离AC都倒在这里了吧(心碎💔),本蒟蒻在这里被恶心了一个晚上,这也就是我为什么要写这篇文章的原因,就是不希望大家在这里浪费时间。
解释如下:我们可以看到它是双重指针,后面有个return和ColumnSizes,不知道大家看到这个会想到什么,我第一时间想到的是,开辟(一定记住返回不论是指针还是双重指针一定要用malloc开创,这也是力扣的一个特点,不用free力扣默认给你free了不用担心)数组图如下
然后每个数组的首个元素存放行数再返回,但是很可惜,这样是错误的?的,希望大家不要理解成这样。
正确的思想是:
我先给出正确的代码大家先看看(下面有解释)
c就是列的意思,r就是行的意思。
我们可以清楚的看到,returnColumnSizes里面只存储了一个指针(可以理解成数组,这里的功能差不多),那个指针里面放了个个行的列数。
下面我给出模仿题目的main()函数,大家看看(非常细节)
解释都在代码里面了,故我就不在多说啦。
int main()
{
int** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes);
int matrix0[3] = { 1, 2, 3 }; // 矩阵第1行元素
int matrix1[3] = { 4, 5, 6 }; //矩阵第2行元素
int* matrix[2] = { matrix0, matrix1 }; // 指针数组, 此处不能直接定义matrix[2][3]作为入参
int matrixSize = 2; //对应行数m
int matrixColSize[2] = { 3, 3 }; // 每一行元素个数n
int returnSize = 0; // 返回矩阵的行数
int* returnColumnSizes = NULL; // 返回矩阵每一行的列数, 是个数组(指针表示)
int** ans = transpose(matrix, matrixSize, matrixColSize, &returnSize, &returnColumnSizes); // 注意这里要用取地址
// 如果要改变一个变量的值, 就需要传入该变量的指针
// ans最终返回为n * m的矩阵
for (int i = 0; i < returnSize; i++)
{
for (int j = 0; j < matrixSize; j++)
{
printf("%d ", ans[i][j]);
}
printf("\n");
}
return 0;
}
接下来是总代码目标数组我就设为两行三列的数组。
数组大家可以自己调整
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes);
int matrix0[3] = { 1, 2, 3 }; // 矩阵第1行元素
int matrix1[3] = { 4, 5, 6 }; //矩阵第2行元素
int* matrix[2] = { matrix0, matrix1 }; // 指针数组, 此处不能直接定义matrix[2][3]作为入参
int matrixSize = 2; //对应行数m
int matrixColSize[2] = { 3, 3 }; // 每一行元素个数n
int returnSize = 0; // 返回矩阵的行数
int* returnColumnSizes = NULL; // 返回矩阵每一行的列数, 是个数组(指针表示)
int** ans = transpose(matrix, matrixSize, matrixColSize, &returnSize, &returnColumnSizes); // 注意这里要用取地址
// 如果要改变一个变量的值, 就需要传入该变量的指针
// ans最终返回为n * m的矩阵
for (int i = 0; i < returnSize; i++)
{
for (int j = 0; j < matrixSize; j++)
{
printf("%d ", ans[i][j]);
}
printf("\n");
}
return 0;
}
int** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes)
{
int r = matrixSize;//行m
int c = *matrixColSize;//列n
int** transmatrix = (int**)malloc(sizeof(int*) * c);
*returnColumnSizes = (int*)malloc(sizeof(int) * c);
for (int i = 0; i < c; i++)
{
transmatrix[i] = (int*)malloc(sizeof(int) * r);
(*returnColumnSizes)[i] = r;
}
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
transmatrix[j][i] = matrix[i][j];
}
}
*returnSize = c;
return transmatrix;
}
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes) {
int r = matrixSize;//行m
int c = *matrixColSize;//列n
int**transmatrix = (int**)malloc(sizeof(int*)*c);
*returnColumnSizes = (int*)malloc(sizeof(int)*c);
for(int i =0;i<c;i++)
{
transmatrix[i] = (int*)malloc(sizeof(int)*r);
(*returnColumnSizes)[i] = r;
}
for(int i =0;i<r;i++)
{
for(int j =0;j<c;j++)
{
transmatrix[j][i] = matrix[i][j];
}
}
*returnSize = c;
return transmatrix;
}
由于本题简单,加上本文重点并不在将解决本题,如果有朋友对本题还有疑惑的话可以去看看官方题解(非常抱歉)
其实写博客不仅仅是为了教大家,同时这也有利于我巩固自己的知识点,和一个学习的总结,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进,如果大家有所收获的话还请不要吝啬你们的点赞和收藏,这可以激励我写出更加优秀的文章。