新城旧梦

导航

任意行列矩阵顺时针螺旋输出

 

昨天参加了腾讯的面试,其中有一道题是要求将矩阵螺旋输出

比如5行6列的矩阵

 

 要求输出结果为:1,2,3,4,5,6,12,18,24,30,29,28,27,26,25,19,13,7,8,9,10,11,17,23,22,21,20,14,15,16

主要思路:写一个方法剥完外面一圈后,矩阵剩下的数据成为一个新的矩阵,再次递归调用此方法,直到剥完

实现代码如下:

import java.util.ArrayList;
import java.util.List;

public class MatrixScrewOutput {

	public static void main(String[] args) {
		int[][] matrix = init(5,6);

		List<Integer> result = new ArrayList<>();
		rotationOutput(matrix,result);

		if (result.size()>0){
			for (int i = 0; i < result.size(); i++) {
				System.out.print(result.get(i) +",");
			}
		}
		else{
			System.out.println("出现错误");
		}
	}

	/**
	 * 初始化矩阵
	 * @param row 行数
	 * @param column 列数
	 * @return
	 */
	private static int[][] init(int row,int column){
		int[][] matrix =new int[row][column];
		for (int i = 0;i<row ;i++){
			for (int j =0; j<column;j++){
				matrix[i][j] = 1 + j+i*column;
			}
		}
		return matrix;
	}

	/**
	 * 遍历从最外层一层层剥数据
	 * @param matrix 矩阵
	 * @param result 输出结果
	 */
	private static void rotationOutput(int[][] matrix,List<Integer>result){
		//矩阵的行数
		int row = matrix.length;
		//没有行,表示已剥完
		if (row<=0){
			return;
		}
		//矩阵的列数
		int column = matrix[0].length;
		//没有列,表示已剥完
		if (column<=0){
			return;
		}
		//表示只剩最后一行或者一列
		if (row ==1|| column==1){
			//将最后一行或者一列插入到result中,即剥完,然后退出递归
			if (row==1){
				//最后一行
				for (int i =0 ;i< column;i++){
					result.add(matrix[0][i]);
				}
			}else{
				//最后一列
				for (int i =0 ;i< row;i++){
					result.add(matrix[i][0]);
				}
			}
			//退出递归
			return;
		}
		//还剩多行多列的情况
		else{
			//处理第一行 ,从左到右
			for(int i = 0;i<column;i++){
				result.add(matrix[0][i]);
			}
			//处理最右边一列,从上到下,注意从第二行开始
			for(int i = 1;i<row;i++){
				result.add(matrix[i][column-1]);
			}
			//处理最下边一行,从右到左,注意从倒数第二列开始
			for (int i= column-2;i>=0;i--){
				result.add(matrix[row-1][i]);
			}
			//处理最左边一列,从下到上,注意从倒数第二行开始且不要第一行数据
			for(int i = row-2;i>0;i--){
				result.add(matrix[i][0]);
			}

			//到此剥完最外面一圈
			if (row==2 || column ==2){
				//表示上面是最后一圈,已剥完
				return;
			}

			//把里面剩下的矩阵再放入到新的矩阵中,再执行此方法剥最外面一圈
			int[][] tmp = new int[row-2][column-2];
			for (int i = 1;i< row-1;i++){
				for (int j = 1;j<column-1;j++){
					tmp[i-1][j-1] = matrix[i][j];
				}
			}
			rotationOutput(tmp,result);
		}
	}
}

  

posted on 2022-01-14 10:46  新城旧梦  阅读(87)  评论(0编辑  收藏  举报