zoukankan      html  css  js  c++  java
  • 顺时针打印矩阵

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

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

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

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

  • 相关阅读:
    五种方法来遍历Map
    怎样去理解Java中的volatile
    大二层网络----Vxlan技术
    HTTP请求响应过程
    TCP数据传输
    TCP标志位
    TCP协议中的三次握手和四次挥手(图解)
    HTTP报文分析
    HTTP报文图示
    DNS数据包结构
  • 原文地址:https://www.cnblogs.com/csxf/p/3575661.html
Copyright © 2011-2022 走看看