题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
}
}
解题思路
因为返回的是ArrayList类型,所以我们需要声明一个ArrayList保存数字。
我们的数组按照顺时针的顺序打印,解决的重点在于我们需要在什么时候改变方向,以及在什么时候停止。
我们可以设置上下左右4个边界值,当我们打印的时候触碰到边界的话,就需要改变方向。
当我们从左到右打印数据时,我们是打印的某一行数据,当我们打印完成后,这样行的数据失效,上边界向下。
其他情况类似。
当上边界始终在下边界之上,下边界始终在上边界之下,左右边界也是这样。这样就说明仍有数据,反之,打印结束。
源码
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
//定义存储结构
ArrayList<Integer> list = new ArrayList<>();
//定义上边界,上边界从0行开始
int up = 0;
//定义下边界,下边界从最大行数开始
int down = matrix.length-1;
//定义左边界,左边界从0列开始
int left = 0;
//定义右边界,右边界从最大列数开始
int right = matrix[0].length-1;
//遍历数组
while(true){
//从左向右运动,运动到右边界,保存数据到list
for(int i = left;i <= right;i++){
list.add(matrix[up][i]);
}
//上边界增大,如果上边界在下边界下方,则跳出循环,反之改变方向
//解释a++和++a的区别:a++是先执行流程,后自加;++a是先自加,后执行流程
if (++up > down) {
break;
}
//向上向下运动,运动到下边界,保存数据到list
for(int i = up;i <= down;i++){
list.add(matrix[i][right]);
}
//右边界减小,如果右边界在左边界左方,则跳出循环,反之改变方向
if (--right < left) {
break;
}
//从右向左运动,运动到左边界,保存数据到list
for(int i = right;i >= left;i--){
list.add(matrix[down][i]);
}
//下边界减小,如果下边界在上边界上方,则跳出循环,反之改变方向
if (--down < up) {
break;
}
//从下向上运动,运动到上边界,保存数据到list
for(int i = down;i >= up;i--) {
list.add(matrix[i][left]);
}
//左边界增加,如果左边界在右边界右方,则跳出循环,反之改变方向
if (++left > right) {
break;
}
}
return list;
}
}