1.题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.
2.解题思路
先得到矩阵的行和列数,然后依次旋转打印数据,一次旋转打印结束后,往对角分别前进和后退一个单位。
要注意单行和单列的情况。
3.代码
import java.util.ArrayList;
/**
* 原矩阵:
* 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
* @author syf
*
*/
public class 顺时针打印矩阵 {
public static void main(String[] args) {
Solution sl= new Solution() ;
int [][]num ={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
ArrayList<Integer> res = sl.resver(num);
System.out.println(res);
}
}
class Solution{
public ArrayList<Integer> resver(int[][] num){
ArrayList<Integer> res = new ArrayList<Integer>();
int row = num.length ;
int col = num[0].length ;
if(row == 0 && col == 0){
return res ;
}
int left = 0 ,right = col -1 , top = 0 , bottom = row - 1 ;
while(left <= right && top <= bottom){
//上:从左到右
for(int i = left ; i <= right ; i ++){
res.add(num[top][i]);
}
//右:从上到下
for(int j = top+1 ; j <= bottom ; j ++){
res.add(num[j][right]);
}
//下:从右到左
if(top != bottom){
for(int i =right-1 ; i >= left ; i -- ){
res.add(num[bottom][i]);
}
}
//左:从下到上
if(left != right){
for(int i = left + 1 ; i <= right -1 ; i ++){
res.add(num[i][left]);
}
}
left ++;right -- ;top ++;bottom -- ;
}
return res;
}
}