输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如,如果输入如下矩阵:
则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
思路:
先判断循环条件,由图可以发现当行数和列数都 > 循环起始点(左上角)* 2时,循环开始。
可以循环之后,就要打印一圈,打印一圈有如下几种情况:
1.向左打印,向左打印适合所有情况。
2.从上向下打印,终止行号要大于起始行号。
3.从右向左打印,除了终止行号要大于起始行号外,还需终止列号要大于起始列号,也就是至少两行两列。
4.从下往上打印,至少需要三行两列,也就是终止行号要比起始行号大2,终止列号要大于起始列号
代码:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int columns = sc.nextInt();
int rows = sc.nextInt();
int[][] numbers = new int[columns][rows];
for (int i = 0; i < columns; i++) {
for(int j = 0; j < rows; j++) {
numbers[i][j] = sc.nextInt();
}
}
PrintMatrixClockwisely(numbers,columns,rows);
}
public static void PrintMatrixClockwisely(int[][] numbers,int columns,int rows) {
if (numbers == null || columns <= 0 || rows <= 0)
return;
int start = 0;
while (columns > start * 2 && rows > start * 2) {
PrintMatrixInCircle(numbers,columns,rows,start);
++start;
}
}
private static void PrintMatrixInCircle(int[][] numbers, int columns, int rows, int start) {
int endX = columns - 1 - start;
int endY = rows - 1 - start;
//从左到右打印一行
for (int i = start; i <= endX; ++i) {
int number = numbers[start][i];
System.out.print(number + " ");
}
//从上到下打印一列
if (start < endY) {
for (int i = start + 1; i <= endY; ++i) {
int number = numbers[i][endX];
System.out.print(number + " ");
}
}
//从右到左打印一行
if (start < endX && start < endY) {
for (int i = endX - 1; i >= start; --i) {
int number = numbers[endY][i];
System.out.print(number + " ");
}
}
//从下到上打印一列
if (start < endX && start < endY-1) {
for (int i = endY - 1; i >= start + 1; --i) {
int number = numbers[i][start];
System.out.print(number + " ");
}
}
}
感觉作者写的方法有点麻烦了,参考一下LeetCode上面一位作者写的代码,很巧妙:
https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/solution/mian-shi-ti-29-shun-shi-zhen-da-yin-ju-zhen-she-di/.