如何顺时针读取二维矩阵?

最近看到一个更好的方法,理解起来相对容易,我也写在博客里了,链接:文章

题目描述

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

 

看到题目我首先想到的是,如何将输入的一连串的数字搞成二维数组,不知道二维数组的行列数,也没有说明是一个n*n的矩阵,但是题目没有要求写出整个程序,只是将方法函数写出来就行了。但是我依然不知道。

 public ArrayList<Integer> printMatrix(int [][] matrix) {
       
    }

想了蛮久的,想到2个方法吧

第一种就是按照顺时针一个个读取,会发现其实就是按照又外到里一圈圈的读取,要想用这种方法的话,我首先必须知道一共有几圈,圈数一定与行列数有关系,这个关系我认为是一个难点,我的分析如下,先判断出行数和列数中较小的数字,若这个数字min是偶数的话,则圈数是min/2,若是奇数的话,则圈数是min/2+1;再一个难点就是如何读一圈

import java.util.ArrayList;
public class Solution {
   public static ArrayList<Integer> printMatrix(int [][] matrix) {
		ArrayList<Integer> a=new ArrayList<>();
		int row=matrix.length;
		int col=matrix[0].length;
		int min=row<col?row:col;
		int circle=0;
		if(min%2==0)
			circle=min/2;
		else
			circle=min/2+1;
		for(int i=0;i<circle;i++){
            //从左到右读一行
			for(int j=i;j<col-i;j++){
				a.add(matrix[i][j]);
			}
            //从上往下都一列
			for(int k=i+1;k<row-i;k++){
				a.add(matrix[k][col-1-i]);
			}
            //从右往左读一行,如果是单行在第一步已经读过,使用row-1-i!=i可以避免
			for(int m=col-2-i;m>=i&&(row-1-i!=i);m--){
				a.add(matrix[row-1-i][m]);
			}
            //从下往上读一列,如果是单列在第二步已经读过,使用col-1-i!=i可以避免
			for(int n=row-2-i;n>i&&(col-1-i!=i);n--){
				a.add(matrix[n][i]);
			}
			
		}
		
	       return a;
    }
}		ArrayList<Integer> a=new ArrayList<>();
		int row=matrix.length;
		int col=matrix[0].length;
		int min=row<col?row:col;
		int circle=0;
		if(min%2==0)
			circle=min/2;
		else
			circle=min/2+1;
		for(int i=0;i<circle;i++){
            //从左到右读一行
			for(int j=i;j<col-i;j++){
				a.add(matrix[i][j]);
			}
            //从上往下都一列
			for(int k=i+1;k<row-i;k++){
				a.add(matrix[k][col-1-i]);
			}
            //从右往左读一行,如果是单行在第一步已经读过,使用row-1-i!=i可以避免
			for(int m=col-2-i;m>=i&&(row-1-i!=i);m--){
				a.add(matrix[row-1-i][m]);
			}
            //从下往上读一列,如果是单列在第二步已经读过,使用col-1-i!=i可以避免
			for(int n=row-2-i;n>i&&(col-1-i!=i);n--){
				a.add(matrix[n][i]);
			}
			
		}
		
	       return a;
    }
}

 

第二种就是读完一行就去掉一行,其实python中有一个模拟魔方逆时针旋转的方法,一直做取出第一行的操作,用这个方法显然是非常合适的,大家可以自己去查一下。

 

 

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务