问题:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
分析:
(1)使用数组的元素总数控制最外层循环,没打印一个总数减1。当总数为0时退出最外层循环
(2)每一次顺时针打印,分为上、右,下、左。设置count表示顺时针的次数,同时控制打印的边界;设置i , j 表示打印位置,内循环没打印一次需要调整i , j的值为下一个内循环的起止位置,避免数组越界和重复打印。
code:
1 public ArrayList<Integer> printMatrix(int [][] matrix) { 2 ArrayList<Integer> list = new ArrayList<Integer>(); 3 int x = matrix.length; 4 int y = matrix[0].length; 5 int total = x*y; 6 int i=0,j=0; //i控制横轴,j控制纵轴 7 int count=0; //记录旋转次数。 8 while(total>0) { 9 //上 10 while(total>0 &&j<(y-count) ) { 11 list.add(matrix[i][j]); 12 j++; 13 total--; 14 } 15 j--; 16 i++; 17 //右 18 while(total>0 && i<(x-count)) { 19 list.add(matrix[i][j]); 20 i++; 21 total--; 22 } 23 i--; 24 j--; 25 //下 26 while(total>0 && j>=count) { 27 list.add(matrix[i][j]); 28 j--; 29 total--; 30 } 31 j++; 32 i--; 33 //左:为了重复打印,所以i>count 34 while(total>0 && i>count) { 35 list.add(matrix[i][j]); 36 i--; 37 total--; 38 } 39 i++; 40 j++; 41 count++; 42 43 44 } 45 return list; 46 }