您的位置:首页 > 职场人生

面试题20:顺时针打印矩阵

2016-06-30 20:02 351 查看
      题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。

      这个问题之前在leecode上也碰到过,当时有人写了一种挺好的方法,借助于游戏设置上下左右的方法,具体有点不记得了。这道题看上去简单,但是写起来不容易,各种情况,开始很难考虑全,先写书上提到的方法吧。 

class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> vect;
if(matrix.size()==0)
return vect;
int rows=matrix.size();
int cols=matrix[0].size();

printMatrix1(vect,matrix,rows,cols);
return vect;
}
void printMatrix1(vector<int> &vect,vector<vector<int> > &matrix,int rows,int cols)
{
int start=0;
while(rows>2*start&&cols>start*2)
{
printMatrix2(vect,matrix,rows,cols,start);
start++;
}
}
void printMatrix2(vector<int> &vect,vector<vector<int> > &nums,int rows,int cols,int start)
{
int xmax=cols-1-start;
int ymax=rows-1-start;
int i,number;
for(i=start;i<=xmax;i++)
{
number=nums[start][i];
vect.push_back(number);
}
if(ymax>start)
{
for(i=start+1;i<=ymax;i++)
{
number=nums[i][xmax];
vect.push_back(number);
}
}
if(start<xmax&&start<ymax)
{
for(i=xmax-1;i>=start;i--)
{
number=nums[ymax][i];
vect.push_back(number);
}
}
if(start<xmax&&start<ymax-1)
{
for(i=ymax-1;i>start;i--)
{
number=nums[i][start];
vect.push_back(number);
}
}
}

};          对于每次打印一圈,有必要说明一下。第一行肯定是要打印的。然后在最右边,从上往下打印的条件是终止行号大于起始行号(也就是至少两行),此时才从上往下打印。第三步是至少有两行两列,此时才能有返回行的打印。同理,第四步条件是终止行比起始行大2,同时终止列大于起始列。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: