输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
解题思路:我们把打印一圈分为四步:第一步从左到右打印一行,第二步从上到下打印一列,第三步从右到左打印一行,第四步从下到上打印一列。值得注意的是,最后一圈有可能退化成只有一行、只有一列,甚至只有一个数字。
因此要仔细分析打印时每一步的前提条件。第一步总是需要的,因为打印一圈至少有一步。如果只有一行,就不用第二步了。也就是需要第二步的前提条件是终止行号大于起始行号。需要第三部打印的前提条件是圈内至少有两行两列,也就是说除了要求终止行号大于起始行号之外,还要求终止列号大于起始列号。需要打印第四步的前提条件是至少有三行两列,因此要求终止行号比起始行号至少大2,终止列号大于起始列号。
C#实现:
#region 顺时针打印矩阵 /// 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 /// public static void PrintMatrixClockwisely(int[,] numbers, int columns, int rows) { if (numbers == null || columns <= 0 || rows <= 0) return; int start = 0; while (columns > start * 2 && rows > start * 2) { PrintMatrixInCircle(numbers, columns, rows, start); start++; } } private static void PrintMatrixInCircle(int[,] numbers, int columns, int rows, int start) { int endX = columns - 1 - start; int endY = rows - 1 - start; // 从左到右打印一行 for (int i = start; i <= endX; i++) Console.Write(numbers[start, i] + ","); // 从上到下打印一列 if (start < endY) for (int i = start + 1; i <= endY; i++) Console.Write(numbers[i, endX] + ","); // 从右到左打印一行 if (start < endX && start < endY) for (int i = endX - 1; i >= start; i--) Console.Write(numbers[endY, i] + ","); // 从下到上打印一行 if (start < endX && start < endY - 1) for (int i = endY - 1; i >= start + 1; i--) Console.Write(numbers[i, start] + ","); } #endregion
Java实现:
/** 顺时针打印矩阵 * 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 */ public static void printMatrixClockwisely(int[][] numbers, int columns, int rows){ if(numbers == null || columns <= 0 || rows <= 0) return; int start = 0; while(columns > start * 2 && rows > start *2){ printMatrixInCircle(numbers, columns, rows, start); start++; } } private static void printMatrixInCircle(int[][] numbers, int columns, int rows, int start) { int endX = columns - 1 - start; int endY = rows - 1 - start; // 从左到右打印一行 for (int i = start; i <= endX; i++) System.out.print(numbers[start][i] + ","); // 从上到下打印一列 if (start < endY) for (int i = start + 1; i <= endY; i++) System.out.print(numbers[i][endX] + ","); // 从右到左打印一行 if (start < endX && start < endY) for (int i = endX - 1; i >= start; i--) System.out.print(numbers[endY][i] + ","); // 从下到上打印一行 if (start < endX && start < endY - 1) for (int i = endY - 1; i >= start + 1; i--) System.out.print(numbers[i][start] + ","); }
Python实现:
def printMatrixClockWisely(numbers, columns, rows): """ 顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 :param numbers: :param columns: :param rows: :return: """ if numbers == None or columns <= 0 or rows <=0: return start = 0 while columns > start * 2 and rows > start *2: printMatrixInCircle(numbers, columns, rows, start) start +=1 def printMatrixInCircle(numbers, columns, rows, start): endX = columns - 1 - start endY = rows - 1 - start # 从左到右打印一行 for i in range(start, endX+1): print(numbers[start][i], end=', ') # 从上到下打印一列 if start < endY: for i in range(start+1, endY+1): print(numbers[i][endX], end=', ') # 从右到左打印一行 if start < endX and start < endY: for i in range(endX - 1, start-1, -1): print(numbers[endY][i], end=', ') # 从下到上打印一行 if start < endX and start < endY - 1: for i in range(endY-1, start, -1): print(numbers[i][start], end=', ')