题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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,10]]
对应输出应该为:
[1,2,4,6,8,10,9,7,5,3]
分析:
-
计算出层数,count为行列长度的最小值/2,为了避免奇偶性对结果的影响,采取(min/2-1)+1。(行为m,列为n)得到了层数,就开始第一次顺序打印。开始从左上到右上,将a[0][0]~a[0][n-1]分别add到List中。然后从右上到右下,将a[1][n-1]~a[m-1][n-1]add到List中。然后从右下到左下a[m-1][n-2]~a[m-1][1]。左下-左上…….根据规律即可慢慢推导出来4个for循环
for (int i = 0; i < count; i++) {
for(int j=i;j<n-i;j++){arrayList.add(matrix[i][j]);}
for (int k = i+1; k < m-i; k++) {arrayList.add(matrix[k][n-i-1]);}
for(int o=n-i-2;(o>=i)&(m-i-1!=i);o--){arrayList.add(matrix[m-i-1][o]);}
for(int p=m-i-2;(p>i)&(n-i-1!=i);p--){arrayList.add(matrix[p][i]);}
} -
第二种方法摘自网友的解释,比较巧妙。
源码等有空就补上:
可以模拟魔方逆时针旋转的方法,一直做取出第一行的操作
例如
1 2 3
4 5 6
7 8 9
输出并删除第一行后,再进行一次逆时针旋转,就变成:
6 9
5 8
4 7
继续重复上述操作即可。
源码:
1.
import java.util.ArrayList;
public class Test1 {
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
if (matrix.length != 0) {
if (matrix[0].length!=0) {
int m = matrix.length;
int n = matrix[0].length;
int count = ((m<n?m:n)-1)/2+1;
for (int i = 0; i < count; i++) {
for(int j=i;j<n-i;j++){arrayList.add(matrix[i][j]);}
for (int k = i+1; k < m-i; k++) {arrayList.add(matrix[k][n-i-1]);}
for(int o=n-i-2;(o>=i)&(m-i-1!=i);o--){arrayList.add(matrix[m-i-1][o]);}
for(int p=m-i-2;(p>i)&(n-i-1!=i);p--){arrayList.add(matrix[p][i]);}
}
}
return arrayList;
}
return arrayList;
}
}
}
2.
可以模拟魔方逆时针旋转的方法,一直做取出第一行的操作
例如
1 2 3
4 5 6
7 8 9
输出并删除第一行后,再进行一次逆时针旋转,就变成:
6 9
5 8
4 7
继续重复上述操作即可。
运行测试:
第一种:
运行时间:36ms
占用内存:8656k
第二种:
总结:
待续