略
题目:输入一个矩阵,按照顺时针打印矩阵内容,例如矩阵为:
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15 16
打印结果为1,2,3,4,8,12,16,15,14,13,9,5
分析
简化分解问题,顺时针打印需要先输出第一排1,2,3,4
,然后再打印8,12,16
,接着是15,14,13
,最后是9,5
.
先说第一步,第一排打印的数据至少有一个,除非数组为空,因为数组至少有一行.
再说第二步,第二步是竖着打印最后一排数据如8,12,16
.它有一个前提条件,就是该数组至少有两行,如果只有一行那就不存在竖着打印.
再说第三步,第三步是倒着打印最后一排数据如15,14,13
,它也有个先决条件,就是数组的行数和列数都需要大于2,然后从最后一行,最后一列的前个数开始向左开始遍历数组,一直到最后一行,第一列的位置为止.
最后是第四步,打印9,5
,同样第四步需要条件才能执行,它需要行数要大于等于3行,列数要大于等于2,然后从第一列,倒数第二行开始向上遍历数组,一直到正数第二行结束为止.
代码实现
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| public class DoIt {
public static void printIt(int[][] nums ,int cols ,int rows ,int start){ int endX = cols - 1 - start; int endY = rows - 1 - start;
for (int i = start;i <= endX;i++){ int number = nums[start][i]; printNumber(number); }
if (start<endY){ for (int i = start+1; i<=endY;i++){ int number = nums[i][endX]; printNumber(number); } }
if (start<endX && start<endY){ for (int i = endX-1; i>=start;i--){ int number = nums[endY][i]; printNumber(number); } }
if (start<endX&& start<endY-1){ for (int i = endY-1; i>=start+1;i--){ int number = nums[i][start]; printNumber(number); } }
}
private static void printNumber(int num){ System.out.print("\t"+num); }
}
|
总结
使用绘图可以帮助思考问题,考虑问题也全面一些.