顺时针打印矩阵

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如,如果输入如下矩阵:
      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.
 
算法分析:
  
  假设矩阵有row行,col列,打印第一圈时左上角坐标是(0,0),第二圈左上角坐标是(1,1),这样以此类推,打印每圈的左上角的第一个的时候,坐标中行标和列标总是相等的,因此选取每圈的左上角为(start,start)
 
,作为分析的目标。
  
  用循环来打印矩阵,很容易可得循环终止条件为 col > start * 2 && row > start *2
 
 
 
  如何打印矩阵的一圈功能,可将打印一圈分为4步:
 
第一步:从左到右打印一行
 
第二步:从上到下打印一列
 
第三步:从右向左打印一行
 
第四步:从下到上打印一列
  
  每一步我们根据起始坐标和终止坐标用一个循环就能打印出一行或者一列。但仍需仔细分析打印每一步的前提条件。第一步总是需要的,因为打印一圈至少需要有一步;如果只有一行,那么就不需要第二步了,也就是说
 
要第二步的前提条件是终止行号大于起始行号,需要第三步的前提条件是圈内至少有两行两列,也就是说除了要求终止行号大于起始行号之外,还要求终止列号大于起始列号,同理,需要打印第四步的前提条
 
是至少有三行两列,因此要求终止行号比起始行号至少大2,同时终止列号大于起始列号
 
源程序:
 
 1 import java.util.ArrayList;
 2 public class Solution {
 3     public ArrayList<Integer> printMatrix(int [][] matrix) {
 4        ArrayList<Integer> result = new ArrayList<Integer>();
 5         if(matrix == null || matrix.length == 0){
 6             return result;
 7         }
 8         int start = 0;
 9         int rows = matrix.length;
10         int columns = matrix[0].length;
11         while(matrix.length>start*2 && matrix[0].length>start*2){
12             printMatrixInCircle(matrix, columns, rows, start, result);
13             start++;
14         }
15         return result;
16     }
17     public void printMatrixInCircle(int[][] matrix, int columns, int rows, int start, ArrayList<Integer> result){
18         int endX = columns-start-1;
19         int endY = rows-start-1;
20         //从左往右打印一行
21         for(int i=start; i<=endX; i++){
22             result.add(matrix[start][i]);
23         }
24         //从上到下打印一列  圈内至少两行
25         //要求终止行号大于起始行号
26         if(endY>start){
27             for(int i=start+1; i<=endY; i++){
28                 result.add(matrix[i][endX]);
29             }
30         }
31         //从右往左打印一行    圈内至少有两行两列 
32         //要求终止行号大于起始行号,同时终止列号大于起始行号
33         if(endY>start && endX>start){
34             for(int i=endX-1; i>=start; i--){
35                 result.add(matrix[endY][i]);
36             }
37         }
38         //从下往上打印一列,圈内至少三行两列
39         //要求终止行号比起始行号至少大2,终止列号大于起始列号
40         if(endY-1>start && endX>start){
41             for(int i=endY-1; i>start; i--){
42                 result.add(matrix[i][start]);
43             }
44         }
45     }
46 }   
原文地址:https://www.cnblogs.com/2390624885a/p/6718589.html