任意行列矩阵顺时针螺旋输出
昨天参加了腾讯的面试,其中有一道题是要求将矩阵螺旋输出
比如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); } } }