目录
tip:Java中获取二维数组的行列:
1.二维数组本质是一维数组,行数=数组名.length,列数=数组名[0].length;
2.列数=数组名[0].length这句之前要判断数组是否为空,若为空则数组名[0]所代表的子数字不存在,会报错。
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如输入以下矩阵:
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) {
// 二维数组行列
int rows = matrix.length;
int columns = matrix[0].length;
// 保存返回序列的数组
ArrayList<Integer> list = new ArrayList<Integer>();
// 功能函数:使用循环打印矩阵
int start = 0;
while(columns > start*2 && rows > start*2){
// 打印一圈儿
int endX = columns - 1 - start;
int endY = rows - 1 - start;
// 从左到右打印一行
for(int i = start; i <= endX; ++i){
list.add(matrix[start][i]);
}
// 从上到下打印一列
if(start < endY){
for(int i = start + 1; i <= endY; ++i){
list.add(matrix[i][endX]);
}
}
// 从右到左打印一行
if(start < endX && start < endY){
for(int i = endX - 1; i >= start; --i){
list.add(matrix[endY][i]);
}
}
// 从下到上打印一列
if (start < endX && start < endY -1) {
for (int i = endY - 1; i > start; i--) {
list.add(matrix[i][start]);
}
}
start++;
}
return list;
}
}