题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
例如,如果输入如下矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
则依次打印出数字
1, 2, 3, 4, 8,1 2, 16, 15, 14, 13 ,9, 5, 6, 7, 11 ,10.
题解:
这道题还是比较的难,个人觉得,考虑必须必须周全,简单的进行一个个的移动求解很难完成。这个考虑问题的思路就是。两个顶点确定了一个矩形,我们解决这个问题就行了,然后只要保持到我们的左上的顶点和右下的顶点不一致(top<=bottom,left<=right)这个是正确的!这个东西呢,其实我曾经遇到过的,也是解决了很多的事情。在做MFC的时候,画矩形框的时候,我们的CRECT就是这样表示的。
我们只要规规矩矩的从左到右 从上到下 从右到左,从下到上的过程就行了,就是这样的处理我们的问题的,然后把矩形收缩。其实就是对应的坐标增减的问题。容易错误的是,可能会出现一维数组,越界检查
代码如下:
package JianzhiOffer;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings("unused")
public class Slutuion17 {
public ArrayList<Integer> printMatrix(int[][] matrix) {
ArrayList<Integer> list = new ArrayList<Integer>();
int col = matrix[0].length;// 第一行的长度,就是多少列
int row = matrix.length;
// 我们使用MFC中表示的坐标来表示的矩形!左上右下
if (row == 0 || col == 0) {
return null;
}
int top = 0, left = 0;
int bottom = row - 1, right = col - 1;
// 打完一圈之后,我们把矩形缩小,继续执行。
while (top <= bottom && left <= right) {
// top left--->top-right
for (int i = left; i <= right; i++) {
list.add(matrix[top][i]);
}
// top right----->bottom right
for (int i = top + 1; i <= bottom; i++) {
list.add(matrix[i][right]);
}
// 这里就是特殊的情况,单行单列的怎么处理
if (top != bottom) {
// bottom right--->bottom left
for (int i = right - 1; i >= left; i--) {
list.add(matrix[bottom][i]);
}
}
if (left != right) {
// bottom left--->top-left
for (int i = bottom - 1; i > top; i--) {
list.add(matrix[i][left]);
}
}
/**
* 缩小圈子
*/
left++;
top++;
right--;
bottom--;
}
return list;
}
}