《九日集训》第九日二级指针

一、今日知识点总结

  1. 二级指针的定义:指向一个地址的指针。以及一个二级指针的解引用

    int x = 1;   		//定义一个变量
    int *p1 = &a;		//将变量的地址,赋值给一个指针
    int **p = &p1;		//将一个指针的地址赋值给一个二级指针。
    //其实还又三级四级,等的指针。但很少用到。
    int *p3 = *p2;  	//将p2指向地址的值,赋值给一个一级指针。
    
    
  2. 力扣中的二级指针

    int **func(** matrix,int matrixSize,int* matrixColSize,int* returnSize,int ** returnColumnSize){
        
    }
    
    //该函数的调用
    
    
    参数名变量类型实际含义
    matrix二级指针传入矩阵(二维数组)的首地址
    matrixSize普通变量传入矩阵的长度
    matrixColSize一级指针传入矩阵每行的长度
    returnSize一级指针传出矩阵的长度,因为要作为参数返回,所有用指针取地址
    returnColumnSize二级指针产出矩阵每行的长度,数组作为参数传出,所有用二级指针
  3. 申请矩阵的内存

    int **mymalloc(int r,int c,int *returnSize,int **returnColumnSizes){
        int i;
        int **ret = (int **)malloc(sizeof(int*)*r);
        *returnColumnSizes = (int*)malloc(sizeof(int)*r);
        *returnSize = r;
        for (i = 0;i<r;i++){
            ret[i] = (int *)malloc(sizeof(int)*c);
            (*returnColumnSizes)[i] = c;
        }
        return ret;
    }
    

二、今日做题记录

第一题

832. 翻转图像

给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。

水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。

反转图片的意思是图片中的 0 全部被 1 替换, 1 全部被 0 替换。例如,反转 [0, 1, 1] 的结果是 [1, 0, 0]。

1变0,0变1。用1减去原来的数,就实现了变换。

//申请矩阵存储空间的方法
int **mymalloc(int r,int c,int *returnSize,int **returnColumnSizes){
    int i;
    int **ret = (int **)malloc(sizeof(int*)*r);
    *returnColumnSizes = (int*)malloc(sizeof(int)*r);
    *returnSize = r;
    for (i = 0;i<r;i++){
        ret[i] = (int *)malloc(sizeof(int)*c);
        (*returnColumnSizes)[i] = c;
    }
    return ret;
}

int** flipAndInvertImage(int** image, int imageSize, int* imageColSize, int* returnSize, int** returnColumnSizes){

    int **ret = mymalloc(imageSize,imageColSize[0],returnSize,returnColumnSizes);
    int i,j;
    for(i=0;i<imageSize;i++){
        for (j = 0;j<imageColSize[0];j++){
            ret[i][j] = 1- image[i][imageColSize[0]-j-1];   //核心变换
        }
    }
    return ret;

}
第二题

867. 转置矩阵

给你一个二维整数数组 matrix, 返回 matrix转置矩阵

矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。

int **mymalloc(int r,int c,int *returnSize,int **returnColumnSizes){
    int i;
    int **ret = (int **)malloc(sizeof(int*)*r);
    *returnColumnSizes = (int*)malloc(sizeof(int)*r);
    *returnSize = r;
    for (i = 0;i<r;i++){
        ret[i] = (int *)malloc(sizeof(int)*c);
        (*returnColumnSizes)[i] = c;
    }
    return ret;
}
int** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes){

    int ** ret  = mymalloc(matrixColSize[0],matrixSize,returnSize,returnColumnSizes);
    int i,j;
    for (i = 0;i<matrixColSize[0];i++){
        for (j =0;j<matrixSize;j++){
            ret[i][j] = matrix[j][i];
        }
    }
    return ret;
    
}
第三题

566. 重塑矩阵

在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。

给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。

重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。

如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

/**
 * 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 **mymalloc(int r,int c,int *returnSize,int **returnColumnSizes){
    int i;
    int **ret = (int **)malloc(sizeof(int*)*r);
    *returnColumnSizes = (int*)malloc(sizeof(int)*r);
    *returnSize = r;
    for (i = 0;i<r;i++){
        ret[i] = (int *)malloc(sizeof(int)*c);
        (*returnColumnSizes)[i] = c;
    }
    return ret;
}
int** matrixReshape(int** mat, int matSize, int* matColSize, int r, int c, int* returnSize, int** returnColumnSizes){
    int mr = matSize;
    int mc = matColSize[0];
    if(mr*mc!=r*c){
        *returnSize = matSize;
        *returnColumnSizes = matColSize;
        return mat;
    }

    int **ret = mymalloc(r,c,returnSize,returnColumnSizes);
    int i,j,ri,rj;
    ri=0;
    rj=0;
    for (i=0;i<r;i++){
        for(j=0;j<c;j++){
            if(rj==mc){
                ri+=1;
                rj = 0;
            }
            ret[i][j] = mat[ri][rj];
            rj+=1;
        }
    }
    return ret;

}
第四题

2022. 将一维数组转变成二维数组

给你一个下标从 0 开始的一维整数数组 original 和两个整数 m 和 n 。你需要使用 original 中 所有 元素创建一个 m 行 n 列的二维数组。

original 中下标从 0 到 n - 1 (都 包含 )的元素构成二维数组的第一行,下标从 n 到 2 * n - 1 (都 包含 )的元素构成二维数组的第二行,依此类推。

请你根据上述过程返回一个 m x n 的二维数组。如果无法构成这样的二维数组,请你返回一个空的二维数组。

int **mymalloc(int r,int c,int *returnSize,int **returnColumnSizes){
    int i;
    int **ret = (int **)malloc(sizeof(int*)*r);
    *returnColumnSizes = (int*)malloc(sizeof(int)*r);
    *returnSize = r;
    for (i = 0;i<r;i++){
        ret[i] = (int *)malloc(sizeof(int)*c);
        (*returnColumnSizes)[i] = c;
    }
    return ret;
}
int** construct2DArray(int* original, int originalSize, int m, int n, int* returnSize, int** returnColumnSizes){
    int i,j,**ret,index;
    if (originalSize != n*m){
        *returnSize = 0;
        return ret;
    }
    index = -1;
    ret = mymalloc(m,n,returnSize,returnColumnSizes);
    for (i=0;i<m;i++){
        for (j=0;j<n;j++){
            ret[i][j] = original[++index];

        }
    }
    return ret;

}

三、今日收获

1,二阶指针,一般用于二维数组。二维数组与二阶指针的应用。

2,1变0,0变1。用1减去原来的数,就实现了变换。

3,矩阵,按主对角线翻转,(一定程度上)就是将下标i,j互换取值。

四、今日疑问

矩阵m*n 如果m!=n ,那么这个矩阵的主对角线是?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值