题目描述

1     2     3     4
5     6     7     8
9    10    11    12

13 14 15 16 17 18 19 20 Diagonal printing of the above matrix is

1
2     5
3     6     9
4     7     10    13
8     11    14     17
12    15    18
16    19
20

解题方法

这个题目可以从右上到左下,从左下到右上,还可以每次转换方向,并且不一定是正方形。

通过观察可以得出

  • diagonal lines的总数是row number + column number - 1
  • 自行对这些line编号,找到它们的规律
  • 根据起点的位置来计算,这里从右上往左下,我们可以对地点列的位置进行判断

Solution

def print_diagonal(matrix):
    row_num = len(matrix)
    col_num = len(matrix[0])
    if not row_num or not col_num:
        return

    total_lines = row_num + col_num - 1
    results = []

    for i in range(total_lines):
        if i < col_num:
            dia_col = i
            dia_row = 0
            dia_values = []
            while dia_col >= 0 and dia_row < row_num:
                dia_values.append(matrix[dia_row][dia_col])
                dia_col -= 1
                dia_row += 1
            results.append(dia_values)
        else:
            dia_col = col_num - 1
            dia_row = i - col_num + 1
            dia_values = []
            while dia_col >= 0 and dia_row < row_num:
                dia_values.append(matrix[dia_row][dia_col])
                dia_col -= 1
                dia_row += 1
            results.append(dia_values)
    return results

Reference