力扣题目的参数解释(力扣初用者必看指南)

发布时间:2024年01月11日

导入:

题目来源:leetcode 867 转置矩阵

参数列表:

int** matrix

int matrixSize

int* matrixColSize

int* returnSize

int** returnColumnSizes

模仿main()函数

完整代码

运行结果

最后本题的AC答案

结语:


导入:

相信初次刷力扣的同学经常会因为题目所给的参数看不懂,导致从入门到入土,例如下面这个题目,相信有一些同学已经汗流浃背了。


不过没有关系今天写这个文章就是为了解决这个问题,让大家更好的融入力扣大家庭(上头上头?)。

首先我先给出我的题目来源,这个变量算比较复杂的,所以也比较有代表性。

题目来源:leetcode 867 转置矩阵

那我们开始咯(yeyeye):

参数列表:

int** matrix

int matrixSize

int* matrixColSize

int* returnSize

int** returnColumnSizes

在刷题的时候题目一定要好好看这种信息也不能放过

翻译如下:

/**

*返回一个大小为*returnSize的数组数组。

*数组的大小以*returnColumnSizes数组的形式返回。

*注意:返回的数组和*columnSizes数组都必须进行mallocated,假设调用者调用free()。

*/


看到这里相信有些朋友就有些想法了吧(没有也没有关系,我会给你将清楚的)

int** matrix

这个就是题目给我们的待转置的数组

int* matrix[2]

int main()
{
	int a[3] = { 1,2,3 };
	int b[3] = { 4,5,6 };
	int* matrix[2] = { a,b };

}

这个比较简单大家也都能理解故我们直接下一个。

int matrixSize

特别注意很多同学(还有我,吐了🤮)可能会因为它的英文而想当然,以为它是整个数组的元素个数,其实它是数组的行数!!!,至于为什么人家就是这么设定的

int* matrixColSize

这个就和它的英文名一样,指的是题目给定数组的列数,不过使用指针来传递的,用的时候记得解引用。

int* returnSize

因为前面有个return所以不难想到,它是要我们返回的(也就是我们求的),后面的Size和前面的matrixSize大同小异,都不是指总元素个数而是行数

int** returnColumnSizes

压轴出场是有道理的,相信许多朋友距离AC都倒在这里了吧(心碎💔),本蒟蒻在这里被恶心了一个晚上,这也就是我为什么要写这篇文章的原因,就是不希望大家在这里浪费时间。

解释如下:我们可以看到它是双重指针,后面有个return和ColumnSizes,不知道大家看到这个会想到什么,我第一时间想到的是,开辟(一定记住返回不论是指针还是双重指针一定要用malloc开创,这也是力扣的一个特点,不用free力扣默认给你free了不用担心)数组图如下

然后每个数组的首个元素存放行数再返回,但是很可惜,这样是错误的?的,希望大家不要理解成这样。

正确的思想是:

我先给出正确的代码大家先看看(下面有解释)

c就是列的意思,r就是行的意思。

我们可以清楚的看到,returnColumnSizes里面只存储了一个指针(可以理解成数组,这里的功能差不多),那个指针里面放了个个行的列数。

下面我给出模仿题目的main()函数,大家看看(非常细节)

模仿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;
}

运行结果

最后本题的AC答案

/**
 * 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;
}

由于本题简单,加上本文重点并不在将解决本题,如果有朋友对本题还有疑惑的话可以去看看官方题解(非常抱歉)

结语:

其实写博客不仅仅是为了教大家,同时这也有利于我巩固自己的知识点,和一个学习的总结,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进,如果大家有所收获的话还请不要吝啬你们的点赞和收藏,这可以激励我写出更加优秀的文章。

文章来源:https://blog.csdn.net/2301_80035594/article/details/135515456
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。