题目
顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
方法一
分析
用旋转魔方的方式,一直取出第一行;
例如
1 2 3
4 5 6
7 8 9
输出并删除第一行后,变为
4 5 6
7 8 9
再进行一次逆时针旋转,就变成:
6 9
5 8
4 7
继续重复上述操作即可。
代码
public static ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> list = new ArrayList<>();
//拿到出事数组的行数
int row = matrix.length;
while(row != 0){
//将数组的第一行先添加进容器中
for(int i=0;i<matrix[0].length;i++)
list.add(matrix[0][i]);
//当行数等于1时就没有必要再继续执行了,在上面打印完之后就可以停止了
if(row == 1)
break;
//删除上面遍历的数组的第一行,然后旋转这个数组并返回
matrix = revert(matrix);
//更新行数
row = matrix.length;
}
//返回
return list;
}
public static int[][] revert(int[][] matrix)
{
int rows = matrix.length;
int cols = matrix[0].length;
int[][] newMatrix = new int[cols][rows-1];
for(int j=cols-1;j>=0;j--)
{
for(int i=1;i<rows;i++)
{
newMatrix[cols-j-1][i-1] = matrix[i][j];
}
}
return newMatrix;
}
方法二
分析
刷 LeetCode 看到的大神题解,感觉容易理解且好写
简单来说,就是不断地收缩矩阵的边界
定义四个变量代表范围,up、down、left、right
- 向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 up 加一,同时判断是否和代表下边界的 down 交错
- 向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 right 减一,同时判断是否和代表左边界的 left 交错
- 向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 down 减一,同时判断是否和代表上边界的 up 交错
- 向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 left 加一,同时判断是否和代表右边界的 right 交错
代码
```java 链接:https://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a?answerType=1&f=discussion 来源:牛客网
import java.util.ArrayList;
public class Solution {
public ArrayList