剑指offer系列17---顺时针打印矩阵(不是很懂)

时间:2023-03-09 09:21:13
剑指offer系列17---顺时针打印矩阵(不是很懂)
 package com.exe4.offer;

 import java.util.ArrayList;
/**
* 17【题目】输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.
* @author WGS
*
*/
public class PrintArraysInCircle { public ArrayList<Integer> printArraysClock(int[][] arrs){
int rows=arrs.length;
int columns=arrs[0].length;
if(arrs==null || rows<=0 || columns<=0)
return null; ArrayList<Integer> list=new ArrayList<Integer>();
//起点坐标
int count=0;
while(columns>count*2 && rows>count*2){
printArraysInCircle(list,arrs,columns,rows,count);
count++;
}
return list;
} public void printArraysInCircle(ArrayList<Integer> list,int[][] arrs,int columns,int rows,int count) {
int endX=columns-1-count;
int endY=rows-1-count;
int number=0; //从左到右打印》》》》》》
for(int i=count;i<=endX;i++){
list.add(arrs[count][i]);
}
//从上到下打印
if(count<endX){
for(int i=count+1;i<=endY;i++){
list.add(arrs[i][endX]);
}
}
//从右到左
if(count<endX && count<endY){
for(int i=endX-1;i>=count;i--){
list.add(arrs[endY][i]);
}
}
//从下到上
if(count<endX && count<endY-1){
for(int i=endY-1;i>=count+1;i--){
list.add(arrs[i][count]);
}
} } public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] arrs = new int[4][4];
arrs[0] = new int[]{1,2,3,4};
arrs[1] = new int[]{5,6,7,8};
arrs[2] = new int[]{9,10,11,12};
arrs[3] = new int[]{13,14,15,16};
// matrix[4] = new int[]{17,18,19,20}; PrintArraysInCircle p = new PrintArraysInCircle();
ArrayList<Integer> list = p.printArraysClock(arrs);
for (Integer integer : list) {
System.out.print(integer+" ");
}
} }