题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵:
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。
分析:
由于是从外圈到内圈的顺序依次打印,我们可以把矩阵想像成若干个圈,我们可以用一个循环来打印一个矩阵中的圈,每次打印一个圈
接下来考虑循环终止的条件,假设这个矩阵的行数为rows,列数为columns,打印第一圈左上角的元素坐标为(0,0)第二圈的左上角元素为(1,1)
以此类推,我们注意到,左上角的坐标中行标和列标都是相同的,于是可以选取左上角为(start,start)作为一个我们分析的目标
对一个5X5的矩阵俄日(2,2)终止条件为columns>start*2;rows>start*2
对于打印一行的四个循环:分析如下:
首先第一步是必须的
第二步前提条件是终止行号大于起始行号;
第三步是:终止行号大于起始行号,终止列号大于起始列号;
第四步是:终止行号要大于起始行号+1,终止列号大于起始列号
Java代码如下所示:
import java.util.Scanner; /** * 顺时针打印矩阵 * @author dell * */ public class Main2 { private void printMatrixClockwisely(int[][] numb,int columns,int rows){ if(numb==null||columns<=0||rows<=0) return; int start=0; while(columns>start*2&&rows>start*2){ printMatrixInCircle(numb,columns,rows,start); start++; } } private void printMatrixInCircle(int[][] numb,int columns,int rows,int start){ int endx=columns-1-start; int endy=rows-1-start; //从左到右打印一行 for(int i=start;i<=endx;i++){ System.out.print(numb[start][i]+" "); } //从上到下打印一列 if(start<endy){ for(int i=start+1;i<=endy;i++){ System.out.print(numb[i][endx]+" "); } } //从左到右打印一行 if(start<endy&&start<endx){ for(int i=endx-1;i>=start;i--){ System.out.print(numb[endy][i]+" "); } } //从下到上打印一列 if(start<endy-1&&start<endx){ for(int i=endy-1;i>start;i--){ System.out.print(numb[i][start]+" "); } } System.out.println("结束一圈"); } public static void main(String[] args){ Scanner scanner=new Scanner(System.in); Main2 main2=new Main2(); int m,n; int[][] matrix; System.out.println("输入行和列值:"); while(scanner.hasNext()){ m=scanner.nextInt(); n=scanner.nextInt(); if(m<=0||n<=0){ System.out.println("无效输入"); }else{ System.out.println("输入元素:"); matrix=new int[m][n]; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ matrix[i][j]=scanner.nextInt(); } } main2.printMatrixClockwisely(matrix, n, m); } } } }
本题:主要考察应聘者的思维方式,从内到外顺时针打印矩阵过程非常复杂,应聘者如何找到规律写出代码,是关键,可以考虑用图像帮助理解