Q14--顺时针打印矩阵

一、题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。例如:如果输入矩阵:
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

二、Java代码实现

import java.util.ArrayList;

    public class PrintMatrixClockWisely {
        public static void main(String[] args){
            int[][] matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
            ArrayList<Integer> al = printMatrix(matrix);
            System.out.println(al);
        }
        public static ArrayList<Integer> printMatrix(int[][] matrix){
            ArrayList<Integer> list = new ArrayList<Integer>();
            if(list == null) return list;
            int rows = matrix.length;
            int columns = matrix[0].length;
            return printMatrix(matrix, columns, rows);
        }

        public static ArrayList<Integer>  printMatrix(int[][] matrix,int columns, int rows){
            ArrayList<Integer> list = new ArrayList<Integer>();
            if(matrix == null || columns <=0 || rows <=0) return list;
            int start = 0;
            while(columns > start *2 && rows > start * 2){
                list.addAll(print (matrix, columns, rows, start));
                ++start;
            }
            return list;
        }

        public static ArrayList<Integer> print(int[][] matrix, int columns, int rows, int start){
            ArrayList<Integer> list = new ArrayList<Integer>();
            int endX  = columns - 1 - start;
            int endY = rows - 1 -start;
            //从左到右
            for(int i = start; i <= endX; ++i)
                list.add(matrix[start][i]);
            //      从上到下
            if(start < endY){
                for(int i = start +1; i <= endY; ++i)
                    list.add(matrix[i][endX ]);
            }
            //      从右到左
            if(start < endX && start < endY){ //至少两行两列 
                for(int i = endX -1; i >= start; --i)
                    list.add(matrix[endY][i]);
            }
            //      从下到上
            if(start < endX && start < endY-1){
                for(int i = endY-1; i > start; --i)
                    list.add(matrix[i][start]);
            }
            return list;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值