题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
思路:
用左上和右下的坐标定位出一次要旋转打印的数据,一次旋转打印结束后,往对角分别前进和后退一个单位。
注意点:控制好后两个 for 循环,需要加入条件判断,防止出现单行或者单列的情况。从右往左打印时,当前值是大于或等于最左边界的。
代码:
package 顺时针打印矩阵;
import java.util.ArrayList;
public class Demo {
public ArrayList<Integer> printMatrix(int[][] matrix) {
ArrayList<Integer> result = new ArrayList<>();
int row = matrix.length; // 行数
int col = matrix[0].length; // 列数
// 输入的二维数组非法,返回空的数组
if (row == 0 || col == 0) {
return result;
}
// 定义四个关键变量,标识坐上和右下的打印范围
int left = 0;
int right = col - 1;
int top = 0;
int bottom = row - 1;
while (left <= right && top <= bottom) {
// 从左往右
for (int i = left; i <= right; i++) {
result.add(matrix[top][i]);
System.out.print(matrix[top][i] + " ");
}
// 从上往下
for (int i = top + 1; i <= bottom; i++) {
result.add(matrix[i][right]);
System.out.print(matrix[i][right] + " ");
}
// 从右往左
for (int i = right - 1; i >= left && top < bottom; --i) {
result.add(matrix[bottom][i]);
System.out.print(matrix[bottom][i] + " ");
}
// 从下往上
for (int i = bottom - 1; i > top && right > left; --i) {
result.add(matrix[i][left]);
System.out.print(matrix[i][left] + " ");
}
++top;
++left;
--right;
--bottom;
}
return result;
}
public static void main(String[] args) {
Demo demo = new Demo();
int[][] numbers = {
{1, 2, 3, 4, 5},
{16, 17, 18, 19, 6},
{15, 24, 25, 20, 7},
{14, 23, 22, 21, 8},
{13, 12, 11, 10, 9},
};
demo.printMatrix(numbers);
System.out.println();
int[][] numbers2 = {
{1, 2, 3, 4, 5, 6, 7, 8},
{22, 23, 24, 25, 26, 27, 28, 9},
{21, 36, 37, 38, 39, 40, 29, 10},
{20, 35, 34, 33, 32, 31, 30, 11},
{19, 18, 17, 16, 15, 14, 13, 12},
};
demo.printMatrix(numbers2);
System.out.println();
int[][] numbers3 = {
{1, 2, 3, 4, 5, 6, 7, 8}
};
demo.printMatrix(numbers3);
System.out.println();
int[][] numbers4 = {
{1, 2, 3, 4, 5, 6, 7, 8},
{16, 15, 14, 13, 12, 11, 10, 9}
};
demo.printMatrix(numbers4);
System.out.println();
int[][] numbers5 = {
{1},
{2},
{3},
{4},
{5},
{6},
{7},
{8}
};
demo.printMatrix(numbers5);
System.out.println();
int[][] numbers6 = {
{1, 2},
{4, 3}
};
demo.printMatrix(numbers6);
System.out.println();
}
}