输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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
思路:
首先得有两个维度是1的判断,剩下就是用list,分别存下矩阵第一行,最后一行,侧面两列的元素比如{1,2,3,4},{13,14,15,16},{8,12},{5,9},遍历完了,不要把四个角的元素取重复了,按着顺时针的方式拼接起来,现在外面一圈已经遍历好了,把矩阵的外围截掉,然后递归调用函数来重复遍历最外围一圈的操作。
代码实现:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static ArrayList<Integer> printMatrix(int [][] matrix) {
int width = matrix[0].length;
int height = matrix.length;
int size = width*height;
ArrayList<Integer> res = new ArrayList<>();
return deal(matrix,res,size);
}
public static ArrayList<Integer> deal(int [][] matrix, ArrayList<Integer> res,int size){
int width = matrix[0].length;
int height = matrix.length;
if(height==1){
for (int i = 0; i < width; i++) {
res.add( matrix[0][i]);
}
return res;
}
if(width==1){
for (int i = 0; i < height; i++) {
res.add( matrix[i][0]);
}
return res;
}
for (int i = 0; i < width; i++) {
res.add( matrix[0][i]);
}
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
for (int i = 1; i < height-1; i++) {
list1.add(matrix[i][0]);
list2.add(matrix[i][width-1]);
}
for (Integer item :list2 ) {
res.add(item);
}
for (int i = width-1; i >=0; i--) {
res.add(matrix[height-1][i]);
}
for (int i = list1.size()-1; i >=0; i--) {
res.add(list1.get(i));
}
if(res.size()<size){
int[][] arr = new int[height-2][width-2];
for (int i = 0; i < height-2; i++) {
for (int j = 0; j < width-2; j++) {
arr[i][j] = matrix[i+1][j+1];
}
}
deal(arr,res,size);
}
return res;
}
public static void main(String[] args) {
// int[][] arr = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
// int[][] arr = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16},{17,18,19,20}};
// int[][] arr = {{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}};
int[][] arr = {{1},{2},{3},{4},{5}};
// int[][] arr = {{1,2,3,4}};
System.out.println(printMatrix(arr));
}
}