顺时针打印矩阵
问题描述:顺时针打印矩阵
首先考察基本功,逻辑分析能力
本方法思想:一圈一圈的打印,每次打印的开始是(start,start),比如 0,0 1,1 2,2;判断条件是cols>2start rows>2start;第二种是自己写的 只需要判断只有一行或者一列的情况,比较容易理解,有三种特殊情况,如下图所示,建议看第二种方法,更好理解
持续更新...
代码附下
Java实现:
package 顺时针打印矩阵;
/**
* 顺时针打印矩阵
* @author user
*一圈一圈的打印,每次打印的开始是(start,start)
*比如 0,0 1,1 2,2
*判断条件是cols>2start rows>2start
*第二种是自己写的 只需要判断只有一行或者一列的情况,比较容易理解
*/
public class Test {
public static void main(String[] args) {
int[][] array = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } };
printStart(array);
}
private static void printStart(int[][] array) {
// TODO Auto-generated method stub
if (array == null || array.length <= 1 || array[0].length <= 1) {
System.out.println("输入错误!");
return;
}
int start = 0;
int rows = array.length;
int cols = array[0].length;
while (cols > 2 * start && rows > 2 * start) {
printMatrixCircle(array, cols, rows, start);
start++;
}
System.out.println();
start = 0;
while (cols > 2 * start && rows > 2 * start) {
printMatrixCircle2(array, cols, rows, start);
start++;
}
}
//这是第一种方法,可以选择跳过
/**
* 打印时会有多种特殊情况 需要多重判断
*
* @param array
* @param cols
* @param rows
* @param start
*/
private static void printMatrixCircle(int[][] array, int cols, int rows, int start) {
// TODO Auto-generated method stub
int endX = cols - 1 - start;
int endY = rows - 1 - start;
// 从左到右打印第一行
for (int i = start; i <= endX; i++) {
System.out.print(array[start][i] + " ");
}
// 打印一列
if (start < endY) {// 如果满足说明至少有两行,不满足说明原来的只有一行
// 打印一列
for (int i = start + 1; i <= endY; i++) {
System.out.print(array[i][endX] + " ");
}
}
// 从右到左打印
if (start < endX && start < endY) {
// 必须是两行两列以上
for (int i = endX - 1; i >= start; i--) {
System.out.print(array[endY][i] + " ");
}
}
// 从下倒上打印
if (start < endX && start < endY - 1) {
for (int i = endY - 1; i > start; i--) {
System.out.print(array[i][start] + " ");
}
}
}
//这是第二种方法
private static void printMatrixCircle2(int[][] array, int cols, int rows, int start) {
// TODO Auto-generated method stub
int endX = cols - 1 - start;
int endY = rows - 1 - start;
// 说明只有一行了
if (start == endY) {
for (int i = start; i <= endX; i++) {
System.out.print(array[start][i] + " ");
}
return;
}
// 说明只有一列了
if (start == endX) {
for (int i = start + 1; i <= endY; i++) {
System.out.print(array[i][endX] + " ");
}
return;
}
// 从左到右打印第一行
for (int i = start; i <= endX; i++) {
System.out.print(array[start][i] + " ");
}
// 打印一列
// 如果满足说明至少有两行,不满足说明原来的只有一行
for (int i = start + 1; i <= endY; i++) {
System.out.print(array[i][endX] + " ");
}
// 从右到左打印
for (int i = endX - 1; i >= start; i--) {
System.out.print(array[endY][i] + " ");
}
// 从下倒上打印
for (int i = endY - 1; i > start; i--) {
System.out.print(array[i][start] + " ");
}
}
}
持续更新...欢迎赞赏!![](https://i-blog.csdnimg.cn/blog_migrate/ca0cc5c488ad24501c0bbddad6302b17.png)
主页:https://blog.csdn.net/ustcer_93lk/article/details/80374008
如果有问题,欢迎大家留言,有更好的方法也期待大家告知。