顺时针打印矩阵
问题描述:顺时针打印矩阵
首先考察基本功,逻辑分析能力
本方法思想:一圈一圈的打印,每次打印的开始是(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://blog.csdn.net/ustcer_93lk/article/details/80374008
如果有问题,欢迎大家留言,有更好的方法也期待大家告知。