Shirlies
宁静专注认真的程序媛~

题目:

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

链接:

http://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a?tpId=13&tqId=11172&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路:

1、定位当前需要打印圈的起始点,考虑行和列不同,奇偶情况,代码中有注释

2、打印起始点开始的行

3、打印当前圈的最后一列,不包括首尾

4、打印最后一行(倒序)

5、打印当前圈的第一列(倒序),不包括首尾

注意:考虑列为1,行为1的情况;考虑进行3,5步时首尾大小问题。

代码:

 1 class Solution {
 2 public:
 3     vector<int> printMatrix(vector<vector<int> > matrix) {
 4         vector<int> ans;
 5         if(matrix.empty()){
 6             return ans;
 7         }
 8         
 9         int rows = matrix.size();
10         int columns = matrix[0].size();
11         //注意奇数,假设行列为5,则打印中间数时,其位置为(2,2)(从0开始计数的)
12         int divRows = (rows + 1) >> 1;
13         int divColumns = (columns + 1) >> 1;
14         //选择小的考虑
15         int startSize = divRows > divColumns?divColumns : divRows;
16         for(int start = 0; start < startSize; ++ start){
17             //每打印一圈时,行和列都需要递减
18             int columnsEnd = columns - 1 - start;
19             int rowsEnd = rows - 1 - start;
20             //打印当前圈的上面的行
21             for(int i = start; i <= columnsEnd; ++ i){
22                 ans.push_back(matrix[start][i]);
23             }
24             
25             //打印当前圈的最后列
26             for(int i = start + 1; i <= rowsEnd - 1; ++ i){
27                 ans.push_back(matrix[i][columnsEnd]);
28             }
29             
30             //打印当前圈的最后行,最后行必须要大于start,否则就可能会重复打印第一行,考虑只有一行的情况
31             if(rowsEnd > start){
32                 for(int i = columnsEnd;i >= start; -- i){
33                     ans.push_back(matrix[rowsEnd][i]);
34                 }
35             }
36             
37             //打印当前圈的第一列,当前列必须小于columnsEnd,否则可能会重复打印最后列,考虑只有一列的情况
38             if(rowsEnd > 1){
39                 for(int i = rowsEnd - 1; columnsEnd > start && i >= start + 1; -- i){
40                     ans.push_back(matrix[i][start]);
41                 }
42             }
43             
44         }
45         
46         return ans;
47     }
48 };

 

posted on 2016-09-03 17:13  Shirlies  阅读(840)  评论(0)    收藏  举报