一、今日知识点总结
-
二级指针的定义:指向一个地址的指针。以及一个二级指针的解引用
int x = 1; //定义一个变量 int *p1 = &a; //将变量的地址,赋值给一个指针 int **p = &p1; //将一个指针的地址赋值给一个二级指针。 //其实还又三级四级,等的指针。但很少用到。 int *p3 = *p2; //将p2指向地址的值,赋值给一个一级指针。
-
力扣中的二级指针
int **func(** matrix,int matrixSize,int* matrixColSize,int* returnSize,int ** returnColumnSize){ } //该函数的调用
参数名 变量类型 实际含义 matrix 二级指针 传入矩阵(二维数组)的首地址 matrixSize 普通变量 传入矩阵的长度 matrixColSize 一级指针 传入矩阵每行的长度 returnSize 一级指针 传出矩阵的长度,因为要作为参数返回,所有用指针取地址 returnColumnSize 二级指针 产出矩阵每行的长度,数组作为参数传出,所有用二级指针 -
申请矩阵的内存
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; }
二、今日做题记录
第一题
给定一个二进制矩阵 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;
}
第二题
给你一个二维整数数组 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;
}
第三题
在 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;
}
第四题
给你一个下标从 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 ,那么这个矩阵的主对角线是?