顺时针打印矩阵
程序员文章站
2022-07-12 09:35:12
...
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
这道题主要是对于边界情况判断比较多,同时需要考虑一行、一列的情况。
对于一行 一列这两种情况,我提前做了判断,while循环里不必去兼容这种情况。
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> list = new ArrayList<>();
if (matrix == null || matrix.length < 1) {
return list;
}
int rows = matrix.length;
int cols = matrix[0].length;
//一行
if (rows == 1) {
for (int i = 0; i < cols; i++) {
list.add(matrix[0][i]);
}
return list;
}
//一列
if (cols == 1) {
for (int i = 0; i < rows; i++) {
list.add(matrix[i][0]);
}
return list;
}
int start = 0;
while (start * 2 < rows && start * 2 < cols) {
// 从左到右 肯定存在
for(int i = start; i <= cols - start - 1; i++) {
list.add(matrix[start][i]);
}
int curCol = cols - start - 1;
//从右上到右下 当前的col必须大于start值
if(curCol > start){
for(int i = start+1; i <= rows - start - 1; i++) {
list.add(matrix[i][curCol]);
}
}
int curRow = rows - start - 1;
// 从右下到左下 当前的row必须大于开始行号
if(curRow > start){
for(int i = cols - start - 2; i >= start; i--) {
list.add(matrix[rows - start - 1][i]);
}
}
//从左下到左上 当前列不能是start列
if(start != curCol) {
for (int i = rows - start - 2; i >= start + 1; i--) {
list.add(matrix[i][start]);
}
}
start++;
}
return list;
}