17 顺时针打印矩阵: Java实现顺时针打印矩阵。即输入一个矩阵,按照从外向里逆时针的顺序打印出每一个数字

转载来源:https://blog.csdn.net/qq_40409115/article/details/80503624

顺时针打印矩阵,输入一个矩阵,按照从外向里逆时针的顺序打印出每一个数字。

输入: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

首先我们观察 4 × 4的矩阵

在这里插入图片描述

再观察 5 × 5的矩阵

在这里插入图片描述

由此我们可以观察出让循环继续进行的条件是:

矩阵的行数>当前的圈数×2且同时要满足矩阵的列数>当前的圈数×2.

import java.util.ArrayList;
public class MyReversePrint
{  
	public static void main(String[] args)  
    {  
        int[][] array =  
        {  
                { 1, 2, 3, 4 },  
                { 5, 6, 7, 8 },  
                { 9, 10, 11, 12 },  
                { 13, 14, 15, 16 } };   
        ArrayList<Integer> printList = new ArrayList<Integer>();  
        printList = reversePrint(array);  
        for (int i = 0; i < printList.size(); i++)  
        {  
            System.out.print(printList.get(i) + "\0");  
        }  
    }  
    public static ArrayList<Integer> reversePrint(int[][] array)  
    {  
        // 二位数组(矩阵)的行数  
        int rows = array.length;  
        // 二位数组(矩阵)的列数  
        int columns = array[0].length;    
        ArrayList<Integer> myList = new ArrayList<Integer>();  
        // start表示圈数,从第0圈开始计数,没走一圈 圈数+1
        int start = 0;  
        //让循环继续进行的条件是:矩阵的行数>当前的圈数×2且同时要满足矩阵的列数>当前的圈数×2.
        while (rows > start * 2 && columns > start * 2)  
        {  
            //记录每圈最后一行的下标
            int endRow = rows - 1 - start;  
            //记录没圈最后一列的下标  
            int endColumn = columns - 1 - start;  
            //一圈圈逆序遍历数组中的元素,并插入到myList中
            //1.从左到右  
            for (int i = start; i <= endColumn; i++)  
                myList.add(array[start][i]);  
            //2.从上到下  
            if (endRow > start)  
            {  
                for (int i = start + 1; i <= endRow; i++)  
                    myList.add(array[i][endColumn]);  
            }  
            //3.从右到左
            if (endRow > start && endColumn > start)  
            {  
                for (int i = endColumn - 1; i >= start; i--)  
                    myList.add(array[endRow][i]);  
            }  
            //4.从下到上
            if (endRow >= start + 2 && endColumn > start)  
            {  
                for (int i = endRow - 1; i > start; i--)  
                    myList.add(array[i][start]);  
            }  
            //圈数自增
            start++;  
        }  
        return myList;  
    }    
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值