题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
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。
思路
从左到右,再从上到下,再从右到左,最后从下到上遍历。
其实这种题思路很简单,考的就是代码能力。所以这种题目一定要多练习,不要因为思路就不做,相信我,你不做你面试的时候一定出问题。
代码
public class Test2 {
public static void main(String[] args) {
int[][] matrix ={
{
1,2,3},{
4,5,6},{
7,8,9}};
System.out.println(spiralOrder(matrix));
}
public static ArrayList<Integer> spiralOrder(int [][] matrix){
ArrayList<Integer> list = new ArrayList<Integer>();
int topRow = 0;
int topCol = 0;
int downRow = matrix.length - 1;
int downCol = matrix[0].length - 1;
while (topRow <= downRow && topCol <= downCol) {
//当满足左上角的小于等于右下角就可以循环
printCircle(list, matrix, topRow++, topCol++, downRow--, downCol--);
}
return list;
}
public static void printCircle(ArrayList<Integer> list, int [][] matrix, int topRow, int topCol, int downRow, int downCol) {
if (topRow == downRow) {
//子矩阵只有一行的时候
for (int i = topCol; i <= downCol; i++) {
//注意循环开始的条件,是从这一列开始,不是从零
list.add(matrix[topRow][i]);
}
}
else if (topCol == downCol) {
//子矩阵只有一列的时候
for (int i = topRow; i <= downRow; i++) {
list.add(matrix[i][topCol]);
}
}
else {
//其他的情况下
int currentRow = topRow;
int currentCol = topCol;
while (currentCol != downCol) {
//左到右 本行最后一个不访问,在下个循环里面。如图
list.add(matrix[topRow][currentCol]);
currentCol++;
}
while (currentRow != downRow) {
//上到下0
list.add(matrix[currentRow][downCol]);
currentRow++;
}
while (currentCol != topCol) {
//右到左
list.add(matrix[downRow][currentCol]);
currentCol--;
}
while (currentRow != topRow) {
//下到上
list.add(matrix[currentRow][topCol]);
currentRow--;
}
}
}
}
原文地址 https://mp.weixin.qq.com/s/A0x8EDvw91p54MVGYnqVQg