您的位置:首页 > Web前端

牛客-剑指offer-顺时针打印矩阵

2017-03-06 21:19 162 查看
一、问题描述

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

二、解题思路

有点类似程序员面试金典中的像素旋转,也是通过分层的思想来解决,但是感觉这个题目更绕。

1     2       3      4       5

6      7      8      9       10

11    12    13    14      15

16     17     18    19      20

21      22     23    24     25

如上图中5*5的矩阵(当然矩阵的m和n不一定相等),首先计算行数m,列数n,以及可以划分的层数circle;外层循环 i 就是矩阵可以划分的层数,内层循环j是每行或者每列需要添加的元素的个数。然后选中某一层,该层的第一行的元素为第 i 行,列位置从 i 到n-i-1;该层的最后一列元素为第n-i-1列,行位置从i+1到m-1-i;该层的最后一行元素为第m-1-i行元素,列位置从n-2-i到i;该层的第一列元素为第i列元素,行位置从m-1-i到i+1。同时还需要判断第1行和最后一行是否重叠,如果重叠只添加一次;同理,判断第一列和最后一列是否重叠,如果重叠,也只添加一次。

三、代码

import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> result=new ArrayList<Integer>();
if(matrix==null)
return result;
int m=matrix.length;
int n=matrix[0].length;
int circle=Math.min(m+1,n+1)/2;
for(int i=0;i<circle;i++){
for(int j=i;j<=n-1-i;j++){//该行是第i行,最大长度是n-1-i
result.add(matrix[i][j]);
}
for(int j=i+1;j<=m-1-i;j++){//该列是第n-1-i列,最大高度是m-1-i
result.add(matrix[j][n-1-i]);
}
for(int j=i+1;j<=n-1-i && m-1-i!=i;j++){//该行是第m-1-i行,最大位置是n-i-2
result.add(matrix[m-1-i][n-1-j]);
}
for(int j=i+1;j<m-1-i && n-1-i!=i;j++){//改列是第i列,最大的位置是
result.add(matrix[m-1-j][i]);
}
}
return result;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: