顺时针打印矩阵

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

例如:如果输入如下矩阵:

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);
            }
            
        }
    }
}

本题:主要考察应聘者的思维方式,从内到外顺时针打印矩阵过程非常复杂,应聘者如何找到规律写出代码,是关键,可以考虑用图像帮助理解

原文地址:https://www.cnblogs.com/csxf/p/3575661.html