输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
解题思路:我们把打印一圈分为四步:第一步从左到右打印一行,第二步从上到下打印一列,第三步从右到左打印一行,第四步从下到上打印一列。值得注意的是,最后一圈有可能退化成只有一行、只有一列,甚至只有一个数字。
因此要仔细分析打印时每一步的前提条件。第一步总是需要的,因为打印一圈至少有一步。如果只有一行,就不用第二步了。也就是需要第二步的前提条件是终止行号大于起始行号。需要第三部打印的前提条件是圈内至少有两行两列,也就是说除了要求终止行号大于起始行号之外,还要求终止列号大于起始列号。需要打印第四步的前提条件是至少有三行两列,因此要求终止行号比起始行号至少大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=', ')
转载于:https://blog.51cto.com/abelxu/1973293