面试题:顺时针打印矩阵

本文介绍了一种按顺时针方向从外向里打印矩阵中每个数字的方法,并提供了详细的算法实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。


先上答案,再分析:

void PrintMatrixClockwisely(int**  numbers,int columns,int rows)

{

 if(numbers==nullptr||columns<=0||rows<=0)

 return;

 int start=0;

 while(columns>start *2&&rows>start *2)

{

 PrintMatrixInCircle(numbers,columns,rows,start);

++start;

}

}

思路:方法PrintMatrixInCircle等会再实现,从上面这波操作来看,先是鲁棒性检测,然后定义了一个start,初始为0。判断依据是行列数都要大于start的两倍,每次循环都换自增的start。这是何解呢?如果刚好是方阵,那么最后的内圈刚好是4个,从那么内圈的左上角的坐标的xy都不过行列数的一半。其实到这应该换个角度想想,一个矩阵,我只要知道其矩阵的左上角的子矩阵(行列各取一半,取底),那么再通过矩阵的行列数,就可以把矩阵整个还原出来。那么根据(start,start)作为每次循环的起点,知道这次循环行列数,不就可以控制循环了么?

那么循环代码如下:

void PrintMatrixInCircle(int** numbers,int columns,int rows,int start)

{

 int endX=columns-1-start;

int endY=rows-1-start;

//从左至右打印一行

for(int i=start;i<=endX;i++)

{

 int number=numbers[start][i];

printNumber(bynver);

}

 //从上到下打印一列

 if(start<endY)

{

 for(int i=start+1;i<=endY;++i)

{

 int number=numbers[i][endX];

  printNumber(number);

}

}

//从右到左打印一行

if(start<endX&&start<endY)

{

 for(int i=endX-1;i>=start;--i)

{

 int number=numbers[endY][i];

printNumber(number)

}

}


//从下到上打印一列

if(start<endX&&start<endY-1)

{

 for(int i=endY-1;i>=start+1;--i)

{

 int number=numbers[i][start];

printNumber(number);

}

}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值