leetcode 解題 6. Z 字形變換-python3@ 官方二維陣列、list 設 flag 按行訪問法

娃哈哈店長發表於2019-12-26

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。

二維陣列方法,很蠢的方法,即佔空間也浪費時間

寫了一個小時,拍腦袋想出了用二維陣列

太菜了哈哈,把這個程式碼放在這刺激自己。


def test3(self, s: str, numRows: int) -> str:
        if numRows < 2:
            return s
        part = numRows*2-2
        print(part)
        print(len(s))
        a = len(s)//part +1
        test = list(s)
        res = [["" for i in range((numRows-1)*a)] for i in range(numRows)]
        # for i in res:
        #     print(i)
        print("a",a)
        n =0
        for j in range((numRows-1)*a):
            # print(j)
            if n ==  numRows -1 or n == 0:
                n = 0
                for i in range(numRows):
                    if test != []:
                        # print("字串",test)
                        res[i][j] = test[0]
                        # for i in res:
                        #     print(i)
                        test.remove(test[0])
                        # print(res)
                n += 1
            else:
                if test != []:
                    # print("轉折")
                    # print((numRows-1)*a)
                    # print(test[0])
                    res[numRows-1-n][j] = test[0]
                    # print(res[n][j])
                    test.remove(test[0])
                n +=1
        # for i in res:
        #     print(i)
        ans = ""
        for i in res:
            # print(i)
            for j in i :
                if j !='':
                    ans += j
                    # print(ans)

        return ans

結果實在是太‘感動’了~~
羞羞臉~~

Accepted
1158/1158 cases passed (1028 ms)
Your runtime beats 5.07 % of python3 submissions
Your memory usage beats 5.06 % of python3 submissions (19.9 MB)

單list按行訪問儲存,設定flag動態訪問

透過從左向右迭代字串,我們可以定字元位於 Z 字形圖案中的哪一行。

解題思路
和二維陣列的思想區別在於,我們我們可以將二維陣列的行list,改為用字串來儲存。
其實之後返回的值也是str所有用字串可以更多地節省str-list-str的轉換資源消耗

  • 首先構建numRows行的list用來儲存資料
    • 這裡每一列都是一個字串形式
  • 假設 numRows為3,
    • 我們需要從res[0]到res[1]到2res[再]到1再res[0]到res[1]到res[2]的來儲存字串資料
      這裡我們需要定義flag,我們每訪問完一次res[start]後:
  • 如果此時的start為第一行或者最後一行
    • 則對flag取相反數,轉換順序
    • (我們開始 從0-1的訪問時,可以先設定預設的flag為-1,當訪問完res[0]後,取相反數,就是正方向了)
def test(self, s: str, numRows: int) -> str:
        if numRows < 2:
            return s
        res = ["" for i in range(numRows)]
        start, flag = 0, -1
        for c in s:
            # print(c)
            res[start] += c
            if start == 0 or start == numRows - 1: 
                flag = -flag
            start += flag
        # for i in range(numRows):
        #     print(res[i])
        return "".join(res)

bingo!

Accepted
1158/1158 cases passed (56 ms)
Your runtime beats 95.67 % of python3 submissions
Your memory usage beats 99.83 % of python3 submissions (12.7 MB)

原始碼儲存在github上,歡迎來提bug哦!-點選訪問
如果覺得不錯請給我一個star謝謝了Stray_Camel(^U^)ノ~YO

本作品採用《CC 協議》,轉載必須註明作者和本文連結
文章!!首發於我的部落格Stray_Camel(^U^)ノ~YO

相關文章