剑指offer(十六)之顺时针打印矩阵

来源:互联网 发布:淘宝上架虚拟宝贝教程 编辑:程序博客网 时间:2024/05/16 01:16
题目描述:

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

思路分析:

顺时针打印就是按圈数循环打印,一圈包含两行或者两列,在打印的时候会出现某一圈中只包含一行,要判断从左向右打印和从右向左打印的时候是否会出现重复打印,
同样只包含一列时,要判断从上向下打印和从下向上打印的时候是否会出现重复打印的情况

代码:

<span style="font-size:18px;">import java.util.ArrayList;public class Solution {    public ArrayList<Integer> printMatrix(int [][] array) {        ArrayList<Integer> list = new ArrayList<Integer> ();        if(array.length==0){            return list;        }         //数组行数        int rows = array.length;          //数组列数        int columns = array[0].length;          if(columns==0){            return list;        }          //打印的圈数        int layers = (Math.min(rows,columns)-1)/2+1;        for(int i=0;i<layers;i++){            //从左至右打印            for(int k = i;k<columns-i;k++){                list.add(array[i][k]);            }            //从右上至右下打印              for(int j=i+1;j<rows-i;j++){                 list.add(array[j][columns-i-1]);            }            //从下右至下左打印,为了避免重复打印行(rows-i-1!=i)            for(int k=columns-i-2;(k>=i)&&(rows-i-1!=i);k--){                list.add(array[rows-i-1][k]);            }            //从左下至左上打印,为了避免重复打印列(columns-i-1!=i)                    for(int j=rows-i-2;(j>i)&&(columns-i-1!=i);j--){                 list.add(array[j][i]);            }                      }        return list;           }}</span>

0 0