顺时针打印矩阵

题目

【剑指offer,面试题20】题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。

思路

看着比较简单的一道题目,但是想起来比较费劲,剑指offer上面的解题过程没看懂,以下思路借鉴自【算法06】顺时针打印矩阵

首先矩阵不一定是方阵,所以按照对角线的思路是不可行的

一个矩阵,给定起点(startX,startY)和终点(endX,endY)(即位于对角线上的两个点)就可以打印一周,然后向里进一周(即++startX,++startY,–endX,–endY)即可,如果起始点坐标<终止点坐标(即startX < endX 或者 startY < endY)循环结束。

给定起点和终点,打印一圈的结束条件是什么?我画了三种情况的矩阵4×4矩阵,3×5矩阵,5×3矩阵(所有矩阵无非就这三种类型,正方形的,偏“胖”的,偏“瘦”的),很快发现,只有三种情况:一直循环到结束,或者只剩下一行,或者只剩下一列。所以我们的函数首先判定:只有一行?打印该行;只有一列,打印该列。都不是,打印四条边上的数字。(如果有两行就可以打印一圈,两列也可以打印一圈)

题目的java实现

package com.cn;

import java.util.Scanner;

public class Matrix {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        //输入矩阵的行数
        int row = sc.nextInt();

        //输入矩阵的列数
        int column = sc.nextInt();

        int[][] a = new int[row][column];

        //输入矩阵
        for(int i = 0; i < row; i++ ){
            for(int j = 0; j < column; j++){
                a[i][j] = sc.nextInt();
            }
        }

        PrintMatrix(a,row,column);
    }

    public static void PrintMatrix(int[][] a, int row, int column){
        //定义起始点下标
        int startX = 0;
        int startY = 0;
        //定义终点下标
        int endX =  row -1;
        int endY = column - 1;

        while(true){

            if(startX > endX || startY > endY){
                break;
            }

            PrintMatrixCircle(a,startX,startY,endX,endY);

            startX++;
            startY++;
            endX--;
            endY--;
        }

    }

    public static void PrintMatrixCircle(int [][]a, int startX, int startY, int endX, int endY){

        //打印一行
        if(startX == endX){
            for(int i = startY; i <= endY; i++){
                System.out.print(a[startX][i] + " ");
            }
        }

        //打印一列
        if(startY == endY){
            for(int j = startX; j<=endX;j++){
                System.out.print(a[j][startY] + " ");
            }
        }

        //打印一圈
        for(int p = startY; p < endY; p++){
            System.out.print(a[startX][p] + " ");
        }

        for(int q = startX; q < endX; q++){
            System.out.print(a[q][endY] + " ");
        }

        for(int m = endY; m > startY; m--){
            System.out.print(a[endX][m] + " ");
        }

        for(int n = endX; n > startX; n--){
            System.out.print(a[n][startY] + " ");
        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值