1. 程式人生 > >[python]矩陣按對角線列印

[python]矩陣按對角線列印

Description:
將一個矩陣(二維陣列)按對角線向右進行列印。(搜了一下發現好像是美團某次面試要求半小時手撕的題)
Example:
Input:
[
[1,2,3,4],
[5,1,2,3],
[9,5,1,2]
]
Output:
[[4],
[3, 3],
[2, 2, 2],
[1, 1, 1],
[5, 5],
[9]]

思路: 考慮每條對角線開頭元素的index(i,j)。i從0開始遍歷,j從col-1開始遍歷,首先考慮j的變化,若j變為0,則保持不變,讓i變化。在確定開頭元素後,可通過設定i+1,j+1及不超過範圍來向lst中對角線上新增元素。
對於以上例子,各對角線開頭元素的index分別為:
(0,3)
(0,2)
(0,1)
(0,0)
(1,0)
(2,0)
其中各lst中的元素index分別為:
[(0,3)]
[(0,2),(1,3)]
[(0,1),(1,2),(2,3)]
[(0,0),(1,1),(2,2)]
[(1,0),(2,1)]
[(2,0)]

程式碼:

def diagonal_right(matrix):
    if not matrix:
        return []
    row = len(matrix)
    col = len(matrix[0])
    col2 = col
    result = []
    for i in range(row):
        for j in range(col2 - 1, -1, -1): #j倒序遍歷
            lst = []
            i1,j1 = i,j #i1,j1用於方便同一對角線元素的新增,否則改變i,j影響開頭元素的選擇
while i1 <= row - 1 and j1 <= col - 1: lst.append(matrix[i1][j1]) j1 += 1 i1 += 1 result.append(lst) if i == 0 and j == 0:#當遍歷完(0,0)開頭的一條對角線後,讓j固定為0 col2 = 1 return('the result is: %s'%result,'end'
) #test print(diagonal_right([[1],[2]])) print(diagonal_right([[1]])) print(diagonal_right([ [1,2,3,4], [5,1,2,3], [9,5,1,2] ]))

輸出:
在這裡插入圖片描述

變型: 由(0,0)開始向左列印:
思路: 同樣考慮每條對角線開頭元素的index(i,j)。i從0開始遍歷,j也從0開始遍歷,首先考慮j的變化,若j變為col-1,則保持不變,讓i變化。在找到開頭元素後,可通過設定i+1,j-1及不超過範圍來向lst中對角線上新增元素。
對於以上例子,各對角線開頭元素的index分別為:
(0,0)
(0,1)
(0,2)
(0,3)
(1,3)
(2,3)
其中各lst中的元素index分別為:
[(0,0)]
[(0,1),(1,0)]
[(0,2),(1,1),(2,0)]
[(0,3),(1,2),(2,1)]
[(1,3),(2,2)]
[(2,3)]

程式碼:

def diagonal_left(matrix):
    if not matrix:
        return []
    row = len(matrix)
    col = len(matrix[0])
    k=0
    result = []
    for i in range(row):
        for j in range(k,col):  # j順序遍歷
            lst = []
            i1, j1 = i, j  # i1,j1用於方便同一對角線元素的新增,否則改變i,j影響開頭元素的選擇
            while i1 <= row - 1 and j1 >=0:
                lst.append(matrix[i1][j1])
                j1 -= 1
                i1 += 1
            if i==0 and j==col-1:
                k=col-1
            result.append(lst)
    return ('the result is: %s' % result, 'end')

# test
print(diagonal_left([[1],[2]]))
print(diagonal_left([[1]]))
print(diagonal_left([
  [1,2,3,4],
  [5,1,2,3],
  [9,5,1,2]
]))

輸出:
在這裡插入圖片描述

此問題還可以有多種變型,若從左下角,右下角按對角線列印等,只需要進行簡單的修改即可實現。