面试题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,同时终止列大于起始列。
这个问题之前在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,同时终止列大于起始列。
相关文章推荐
- 黑马程序员——多线程(上)
- 码农在工作中的必备能力
- js面试程序题及详解
- Android面试集锦六
- Java线程面试题
- Android面试集锦五
- 剑指Offer-面试题22:栈的压入、弹出序列
- 【那些年遇到过的面试题】gdb调试多线程
- Android面试集锦四
- java面试题
- java开发面试题一
- 【那些年遇到过的面试题】list和vector有什么区别
- 程序员必须知道的延迟时间
- 【老码农怀旧】一个简单好用的分页存储过程
- 贪心算法-面试
- Java 基础部面试
- 【那些年遇到过的面试题】traceroute和tracert有什么区别
- 程序员每天该做的事
- 程序员的修养 -- 如何写日志(logging)
- JAVA面试题一