1、题目描述
输入一个矩阵,按照从外向里以顺时针依次打印出每一个数 字,例如,如果输入如下 4X4 矩阵: 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。
2、问题分析
收缩矩阵的边界
-
定义四个变量代表范围,row1、row2、col1、col2;
-
向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 row1 加一,同时判断是否和代表下边界的 col2 交错;
-
向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 col2 减一,同时判断是否和代表左边界的 left 交错;
-
向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 row2 减一,同时判断是否和代表上边界的 up 交错;
-
向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 left 加一,同时判断是否和代表右边界的 col2 交错。
3、代码
package com.ypj.java;
import java.util.ArrayList;
public class PrintArrayReverse {
public ArrayList<Integer> printArrayReverse(int[][] array){
int row1=0;
int row2=array.length-1;
int col1=0;
int col2=array[0].length-1;
ArrayList<Integer> arraylist = new ArrayList<Integer>();
if(array == null || array.length == 0 || array[0].length == 0){
return arraylist;
}
while((row1 <= row2) && (col1 <= col2)){
for(int i=col1;i<= col2;i++){
arraylist.add(array[row1][i]);
}
for(int i=row1+1;i<=row2;i++){
arraylist.add(array[i][col2]);
}
for(int i=col2-1;i>=col1;i--){
arraylist.add(array[row2][i]);
}
for(int i=row2-1;i>row1;i--){
arraylist.add(array[i][col1]);
}
row1 ++;
row2 --;
col1 ++;
col2 --;
}
return arraylist;
}
public static void main(String[] args) {
int[][] array = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
// int[][] array = {{},{}};
PrintArrayReverse printArrayReverse = new PrintArrayReverse();
System.out.println(printArrayReverse.printArrayReverse(array));
}
}
4、运行结果