题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.
思路:
用左上和右下的坐标定位出一次要旋转打印的数据,一次旋转打印结束后,往对角分别前进和后退一个单位,从而四个循环分别打印每次的四个边,而在这个算法中最主要的问题还是出在当外部遍历完剩下单列和单行的情况下,这个时候可能会造成重复打印。比如打印单行的时候判断top!=butom为true才打印这个单行,因为在第三的循环中打印的是最下面的一行如果只有一行那么这个时候该一行在第一次循环就打印了。如果打印单列的时候只要left != right的时候才会进行第四个虚幻,如果left == right只有一列,那么这一列在第二个循环里面就打印了。
实现:
public ArrayList<Integer> printMatrix(int [][] matrix) {
int row = matrix.length;
int col = matrix[0].length;
ArrayList<Integer> list = new ArrayList<Integer>();
if(row == 0 || col == 0){
return list;//输入的二维数组非法,返回的是一个空的数组
}
int left = 0; int top = 0; int right = col - 1; int buttom = row - 1;
while(left <= right && top <= buttom){
for(int i = left; i <= right; i ++){
list.add(matrix[top][i]);
}
for(int i = top + 1; i <= buttom; i ++){
list.add(matrix[i][right]);
}
if(top != buttom){
for(int i = right - 1; i >= left; i --){
list.add(matrix[buttom][i]);
}
}
if(left != right){
for(int i = buttom -1; i > top ; i --){
list.add(matrix[i][left]);
}
}
left ++; top ++; right --; buttom --;
}
return list;
}