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