顺时针打印数组

【问题】输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.

【思路】这道题目需要我们学会如何设置变量,让程序更加好写一些,当我们通过设置上、下、左、右四个变量,可以很轻松的完成矩阵最外圈的打印,然后依次从外围向内打印!共需要四个打印过程!需要注意的是,当一个矩阵为列向量或者行向量又或者循环达到一个列向量或者行向量时,需要通过条件语句对后两个打印过程进行剔除,否则会造成重复打印,比如矩阵[1,2,3,4]打印成[1,2,3,4,3,2,1]

 1class Solution {
 2public:
 3    vector<int> printMatrix(vector<vector<int> > matrix) {
 4        int rows = matrix.size();
 5        int cols = matrix[0].size();
 6        vector<int> res;
 7
 8        // 输入的二维数组非法,返回空的数组
 9        if (rows == 0 || cols == 0)  return res;
10
11        // 定义四个关键变量,表示左上和右下的打印范围
12        int left = 0, top = 0, right = cols - 1, bottom = rows - 1;
13        while (left <= right && top <= bottom)
14        {
15            // 从左向右打印
16            for (int i = left; i <= right; ++i)  
17                res.push_back(matrix[top][i]);
18            // 从上到下打印
19            for (int i = top + 1; i <= bottom; ++i)  
20                res.push_back(matrix[i][right]);
21            // 从右向左打印
22            if (top != bottom)  // 为了避免矩阵是个行向量,重复打印
23            for (int i = right - 1; i >= left; --i)  
24                res.push_back(matrix[bottom][i]);
25            // 从下到上打印
26            if (left != right)  // 为了避免矩阵是个列向量,重复打印
27            for (int i = bottom - 1; i > top; --i)  
28                res.push_back(matrix[i][left]);
29            left++,top++,right--,bottom--;
30        }
31        return res;
32    }
33};
原文地址:https://www.cnblogs.com/zhudingtop/p/11332852.html