首页 > 试题广场 >

顺时针打印矩阵 题目:输入一个矩阵,按照从外向里以顺时针的顺

[问答题]

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

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。

分析:包括Autodesk、EMC在内的多家公司在面试或者笔试里采用过这道题。

http://m.shangxueba.com/ask/1192657.html?fromproxy=1
发表于 2015-09-02 22:35:03 回复(0)
这个题目主要是实现对矩阵边界的控制,以及确定矩阵是否已经被无重复地完全读取过。

首先,对每一个边界进行读取的时候,要控制矩阵索引下标指向的位置是正确的;
其次,每一行每一列读取完毕之后,改动行列的最大最小边界值;
最后,及时判断矩阵的数值是否已经被完全读取过。

一下是我的代码,并非最优,仅供参考
class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        int total=0;
        int row_len = matrix.size();
        int line_len = matrix[0].size();
         
        int row_min = 0;
        int row_max = row_len-1;
        int line_min = 0;
        int line_max = line_len - 1;
        int i=0,j=0;
        vector< int > res;
  
        if(!matrix.empty() && row_len > 0 && line_len > 0)
        {
            while(total < row_len * line_len)
            {
                while(j >= line_min && j <= line_max)
                    {
                    res.push_back(matrix[i][j++]);
                    total++;
                }
                     
                j--;
                i++;
                row_min++;
                if(i<row_min || i>row_max)
                    break;
  
                while( i >= row_min && i <= row_max)
                    {
                    res.push_back(matrix[i++][j]) ;
                    total++;
                }
                   
                i--;
                j--;
                line_max--;
                if(j>line_max || j<line_min)
                    break;
  
                while( j >= line_min && j <= line_max)
                    {
                    res.push_back(matrix[i][j--]) ;
                    total++;
                }
                    
                j++;
                i--;
                row_max--;
                 if(i<row_min || i>row_max)
                    break;
  
                while( i>= row_min && i<= row_max)
                    {
                    res.push_back(matrix[i--][j]) ;
                    total++;
                }
                     
                i++;
                j++;
                line_min++;
                if(j>line_max || j<line_min)
                    break;
            }
        }
          
        return res;
    }
 
};

编辑于 2015-08-04 20:37:15 回复(0)