1. 程式人生 > 實用技巧 >Linux程序管理的基本概述

Linux程序管理的基本概述

  • 題目描述

輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字。

示例 1:

輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[1,2,3,6,9,8,7,4,5]
示例 2:

輸入:matrix =[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
輸出:[1,2,3,4,8,12,11,10,9,5,6,7]

限制:

0 <= matrix.length <= 100
0 <= matrix[i].length<= 100

  • 解法一:參考劍指offer書上解法,模擬順時針迴歸過程

如圖,列印一圈的過程可以分解為4個分步驟:從左往右,從上往下,從右往左,從下往上

1.首先可以將每次順時針旋轉的一圈的左上角和右下角座標找到,將左上角座標設為(start,start),設矩陣行數為rows,列數為columns,因此,列印一圈的條件的是colums>2*start,rows>2*start。

2.對於列印一圈的4個步驟,有的情況不一定全部包含4個步驟,因此在進行每個步驟的時候,需要判斷

判斷條件:

a) 從左往右,始終需要

b) 從上往下,起始行號<終止行號

c) 從右往左,起始行號<終止行號,起始列號<終止列號

d) 從下往上,起始列號<終止行號,起始列號<終止列號-1

class Solution:
    
def spiralOrder(self, matrix): if not matrix: return columns = len(matrix[0]) #列數 rows = len(matrix) #行數 start = 0 printList = [] def PrintMatrixInCircle(matrix, columns, rows, start): alist = [] endx = columns - start - 1 #列印總列數 endy
= rows - start - 1 #列印總行數 #從左往右列印 for i in range(start,endx+1): alist.append(matrix[start][i]) #從上往下列印 if start < endy: for i in range(start+1, endy+1): alist.append(matrix[i][endx]) #從右往左列印 if start < endx and start < endy: for i in range(endx-1, start-1, -1): alist.append(matrix[endy][i]) #從下往上列印 if start < endx and start < endy - 1: for i in range(endy-1, start, -1): alist.append(matrix[i][start]) return alist while columns > start * 2 and rows > start * 2: printList += PrintMatrixInCircle(matrix, columns, rows, start) start += 1 return printList
  • 解法二:參考題解,設定邊界

設定列印的左右上下邊界為:l,r,t,b。從左往右列印,則t+1,r-1此時需要判斷t<b,否則跳出列印,同理上往下,從右向左,從下往上均是。

def spiralOrder(self, matrix):
        if not matrix:return []
        l, r, t, b, res = 0, len(matrix[0])-1, 0, len(matrix)-1, []
        while True:
            for i in range(l, r+1):
                res.append(matrix[t][i])
            t += 1
            if t > b:break
            for i in range(t, b+1):
                res.append(matrix[i][r])
            r -= 1
            if r < l:break
            for i in range(r, l-1, -1):
                res.append(matrix[b][i])
            b -= 1
            if b < t:break
            for i in range(b, t-1, -1):
                res.append(matrix[i][l])
            l += 1
            if l > r:break
        return res