1. 程式人生 > 其它 >LeetCode騰訊精選練習50——第七天

LeetCode騰訊精選練習50——第七天

技術標籤:LeetCode連結串列矩陣python

題目54:螺旋矩陣
給定一個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,返回矩陣中的所有元素。
題解:

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        # 取首行,去除首行後,對矩陣翻轉來建立矩陣
        # 再遞迴知道新矩陣為[],退出並將取到的資料返回
        res = []
        if matrix == []:
            return
res res.extend(matrix[0]) new_matrix = [reversed(i) for i in matrix[1:]] if new_matrix == []: return res r = self.spiralOrder([i for i in zip(*new_matrix)]) res.extend(r) return res

執行結果:
在這裡插入圖片描述
題目59:螺旋矩陣Ⅱ
給定一個正整數 n,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。

題解:

class Solution(object):
    def generateMatrix(self, n):
        """
        :type n: int
        :rtype: List[List[int]]
        """
        array = [[0 for i in range(n)] for j in range(n)]
        c, j = 1, 0
        while c<=n*n:
            # 從左向右
            for
i in range(j, n-j): array[j][i] = c c += 1 # 從上往下走 for i in range(j+1, n-j): array[i][n-j-1] = c c += 1 # 從右往左走 for i in range(n-j-2, j-1, -1): array[n-j-1][i] = c c += 1 # 從下往上走 for i in range(n-j-2, j, -1): array[i][j] = c c += 1 j += 1 return array

執行結果:
在這裡插入圖片描述
題目61:旋轉連結串列
給定一個連結串列,旋轉連結串列,將連結串列每個節點向右移動 k 個位置,其中 k 是非負數。
題解:

class Solution:
    def rotateRight(self, head: ListNode, k: int) -> ListNode:
        if not head: return None
        orig_head, cnt = head, 1        #cnt如果會遍歷到none,就從0開始計數(右開空間),如果遍歷到最後有效位,就從1開始(右閉空間)
        while head.next:                # head遍歷到了最後一位
            head, cnt = head.next, cnt+1   # cnt若從1開始,且緊跟著head,那麼pointer最終停到哪,cnt就包括到哪。是完全相同的
        head.next = orig_head           # 首尾連線上

        step = cnt - k % cnt-1          # 計算有效移動步數
        while step > 0:
            orig_head, step = orig_head.next, step - 1
        
        new_head, orig_head.next = orig_head.next, None
        return new_head

執行結果:
在這裡插入圖片描述