前言
- 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。
- 个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer:
目录
- 前言
- 问题描述:
- 举例:
- 解法思路:
- 代码结果:
- 结束语
问题描述:
- 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:
[[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]]
- 则依次打印出数字
[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]
- 数据范围:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
举例:
//示例1:
//输入:
[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
//返回值:
[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]
//==========================
//示例2:
//输入:
[[1,2,3,1],[4,5,6,1],[4,5,6,1]]
//返回值:
[1,2,3,1,1,1,6,5,4,4,5,6]
解法思路:
- 可以将矩阵看成若干层,首先打印最外层的元素,其次打印次外层的元素,直到打印最内层的元素。
代码结果:
void print_core(int** matrix,int *a, int R,int C,int begin_r,int begin_c)
{int r,c;if((2*begin_r)>R-1||(2*begin_c)>C-1)//矩阵中没有元素了return;if(R-2*begin_r==1) //还剩一行{for(c=begin_c;c<C-begin_c;c++)a[c-begin_c]=matrix[begin_r][c];return;}else if(C-2*begin_c==1) //还剩一列{for(r=begin_r;r<R-begin_r;r++)a[r-begin_r]=matrix[r][begin_c];return;}//顺时针打印for(c=begin_c;c<C-begin_c-1;c++){*a = matrix[begin_r][c];a++;}for(r=begin_r;r<R-begin_r-1;r++){*a = matrix[r][C-begin_c-1];a++;}for(c=C-begin_c-1;c>begin_c;c--){*a = matrix[R-begin_r-1][c];a++;}for(r=R-begin_r-1;r>begin_r;r--){*a = matrix[r][begin_c];a++;}print_core(matrix,a,R,C,begin_r+1,begin_c+1);//打印剩下的部分}int* printMatrix(int** matrix, int matrixRowLen, int* matrixColLen, int* returnSize ) {int *a=(int*)malloc(sizeof(int)*(matrixRowLen*(*matrixColLen)));*returnSize=matrixRowLen*(*matrixColLen);if(*returnSize==0)return NULL;print_core(matrix,a,matrixRowLen,(*matrixColLen),0,0);return a;
}
结束语
- 以上就是该C语言编程题的内容。可以在牛客尝试刷几道题目来练习实践。牛客网刷题(点击可以跳转),可以尝试注册使用。
- 题目来自:牛客/题库 / 在线编程 / 剑指offer: