剑指 Offer - 19 - 顺时针打印矩阵
题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 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
。
解析
题目本身很容易,但是代码容易写的很乱,所以这里考虑一种宏观思考问题的思想。
- 使用矩阵分圈处理的方式,在矩阵中使用
(ar,ac)
表示左上角,(br,bc)
表示矩阵的右下角; - 每次只需要通过这四个变量打印一个矩阵,然后用一个宏观的函数来调用打印的局部的函数,这样调理更加清晰;
代码
import java.util.ArrayList;
public class Solution {
private ArrayList<Integer> res;
public ArrayList<Integer> printMatrix(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
return null;
res = new ArrayList<>();
int ar = 0, ac = 0, br = matrix.length - 1, bc = matrix[0].length - 1;
while (ar <= br && ac <= bc)
print(ar++, ac++, br--, bc--, matrix);
return res;
}
private void print(int ar, int ac, int br, int bc, int[][] matrix) {
if (ar == br)
for (int j = ac; j <= bc; j++) res.add(matrix[ar][j]);
else if (ac == bc)
for (int i = ar; i <= br; i++) res.add(matrix[i][ac]);
else {
for (int j = ac; j < bc; j++) res.add(matrix[ar][j]);
for (int i = ar; i < br; i++) res.add(matrix[i][bc]);
for (int j = bc; j > ac; j--) res.add(matrix[br][j]);
for (int i = br; i > ar; i--) res.add(matrix[i][ac]);
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论