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

由于从外圈到内圈的顺序依次打印,可以把矩阵想象成若干个圈。用一个循环来打印矩阵,每一次打印矩阵中的一个圈。而这个矩阵的行数是rows,列数是columns。而每一圈开始的坐标中行标和列标总是相同的。可以在矩阵中选取左上角为(start,start)的一圈为分析的目标。而循环继续的条件是columns>startX*2并且row>startY*2。
代码实现:
public class Solution{ public static void printMatrix(int[][] numbers){ if(numbers==null){ return; } int rows=numbers.length; int columns=0; if(rows>0){ columns=numbers[0].length; } int start=0; //rows>start*2并且columns>start*2 循环 while(rows>start*2&&columns>start*2){ printMatrixInCircle(numbers,columns,rows,start); start++; } } public static void printMatrixInCircle(int[][] numbers,int columns,int rows,int start){ //每一次循环,所在圈的最大列和最大行坐标 int endX=columns-1-start; int endY=rows-1-start; //从左至右打印一行 for(int i=start;i<=endX;i++){ int number=numbers[start][i]; System.out.print(number+" "); } //从上至下打印一列 if(start<endY){ for(int i=start+1;i<=endY;i++){ int number=numbers[i][endX]; System.out.print(number+" "); } } //从右至左打印一行 if(start<endX&&start<endY){ for(int i=endX-1;i>=start;i--){ int number=numbers[endY][i]; System.out.print(number+" "); } } //从下至上打印一列 if(start<endX&&start<endY-1){ for(int i=endY-1;i>=start+1;i--){ int number=numbers[i][start]; System.out.print(number+" "); } } } public static void main(String[] args){ int[][] arr={{1,2,3,4}}; int[][] arr1={{1},{5},{9},{13}}; int[][] arr2={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int[][] arr3={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; printMatrix(arr); System.out.println(); printMatrix(arr1); System.out.println(); printMatrix(arr2); System.out.println(); printMatrix(arr3); } }
posted on
浙公网安备 33010602011771号