剑指offer之顺时针打印矩阵(java)——超详细!!!

本文详细解析了如何使用Java实现矩阵螺旋打印算法,通过设定边界值的方法,按顺时针方向逐层打印矩阵中的元素,直至所有元素被打印完毕。算法巧妙地利用了边界条件来判断打印的方向和终止条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       
    }
}

解题思路

                              

因为返回的是ArrayList类型,所以我们需要声明一个ArrayList保存数字。

我们的数组按照顺时针的顺序打印,解决的重点在于我们需要在什么时候改变方向,以及在什么时候停止。

我们可以设置上下左右4个边界值,当我们打印的时候触碰到边界的话,就需要改变方向。

当我们从左到右打印数据时,我们是打印的某一行数据,当我们打印完成后,这样行的数据失效,上边界向下。

其他情况类似。

当上边界始终在下边界之上,下边界始终在上边界之下,左右边界也是这样。这样就说明仍有数据,反之,打印结束。

源码

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        //定义存储结构
        ArrayList<Integer> list = new ArrayList<>();
        //定义上边界,上边界从0行开始
	int up = 0;
        //定义下边界,下边界从最大行数开始
	int down = matrix.length-1;
        //定义左边界,左边界从0列开始
	int left = 0;
        //定义右边界,右边界从最大列数开始
	int right = matrix[0].length-1;
        //遍历数组
	while(true){
		//从左向右运动,运动到右边界,保存数据到list
		for(int i = left;i <= right;i++){
			list.add(matrix[up][i]);
		}
                //上边界增大,如果上边界在下边界下方,则跳出循环,反之改变方向
                //解释a++和++a的区别:a++是先执行流程,后自加;++a是先自加,后执行流程
		if (++up > down) {
                break;
                }

		//向上向下运动,运动到下边界,保存数据到list
		for(int i = up;i <= down;i++){
			list.add(matrix[i][right]);
		}
                //右边界减小,如果右边界在左边界左方,则跳出循环,反之改变方向
		if (--right < left) {
			break;
		}

                //从右向左运动,运动到左边界,保存数据到list
		for(int i = right;i >= left;i--){
			list.add(matrix[down][i]);
		}
                //下边界减小,如果下边界在上边界上方,则跳出循环,反之改变方向
		if (--down < up) {
			break;
		}

                //从下向上运动,运动到上边界,保存数据到list
		for(int i = down;i >= up;i--) {
		    list.add(matrix[i][left]);
		}
                //左边界增加,如果左边界在右边界右方,则跳出循环,反之改变方向
		if (++left > right) {
			break;
		}
	}
	return list;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值