前言
- 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。
- 个人刷题练习系列专栏:个人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: