第100期-基礎結構:字串 Z 字形變換
阿新 • • 發佈:2022-01-06
1 問題描述
將一個給定字串 s 根據給定的行數 numRows ,以從上往下、從左到右進行 Z 字形排列。
比如輸入字串為 "PAYPALISHIRING" 行數為 3 時,排列如下:
P A H N
A P L S I I G
Y I R
之後,你的輸出需要從左往右逐行讀取,產生出一個新的字串,比如:"PAHNAPLSIIGYIR"。
示例 1:
輸入:s = "PAYPALISHIRING", numRows = 3
輸出:"PAHNAPLSIIGYIR"
示例 2:
輸入:s = "PAYPALISHIRING", numRows = 4
輸出:"PINALSIGYAHRPI"
解釋:
P I N
A L S I G
Y A H R
P I
示例 3:
輸入:s = "A", numRows = 1
輸出:"A"
初始程式碼
from typing import List class Solution: def convert(self, s: str, numRows: int) -> str: #在此之間填寫程式碼 print(Solution().convert("PAYPALISHIRING",3)) print(Solution().convert("PAYPALISHIRING",4)) print(Solution().convert("A",1))View Code
2 解題思路
- 標籤:字串
- 我們先假定有 numRows=4 行來推導下,其中 2numRows-2 = 6 , 我們可以假定為 step=2numRows-2 ,我們先來推導下規則:
- 第0行: 0 - 6 - 12 - 18
- ==> 下標間距 6 - 6 - 6 ==> 下標間距 step - step - step
- 第1行: 1 - 5 - 7 - 11 - 13
- ==> 下標間距 4 - 2 - 4 - 2 ==> 下標間距step-21(行)-21(行)-step-21(行)-21(行)
- 第2行: 2 - 4 - 8 - 10 - 14
- ==> 下標間距 2 - 4 - 2 - 4 ==> 下標間距step-22(行)-2
- 第3行:3 - 9 - 15 - 21
- ==> 下標間距間距 6 - 6 - 6 ==>下標間距step - step - step
#3 解題方法
from typing import List class Solution: def convert(self, s: str, numRows: int) -> str: if numRows==1 :return s else:n,b,c,y=0,0,0,[] while b<numRows: try: y.append(s[n]) except: b+=1 if b==0 or b==numRows-1:n+=(numRows-1)*2 else: if c%2==0:n+=((numRows-1)*2-2*b) else:n+=(2*b) c+=1 if n>=len(s): b+=1 n,c=b,0 return ''.join(y) print(Solution().convert("PAYPALISHIRING",3)) print(Solution().convert("PAYPALISHIRING",4)) print(Solution().convert("A",1))View Code
第1-3,19-21行:題目中已經給出的資訊,執行程式碼時要根據這些程式碼進行編輯
第4行:特殊情況,當numRows等於1時,直接返回原字串
第5行:定義變數n,b,c為0以及空列表y,n用於索引字串,b用於判斷行數,c用於判斷每次的特殊情況
第6行:定義變數p用於存放字串s長度
第7行:當b小於numRows的大小時,執行迴圈
第8行:當n在字串長度內時,將n對應的字元加入列表y中
第9行:對於第0行和最後一行,下標距離為(numRows-1)*2
第10-13行:對於中間的行數,下標距離按照週期二迴圈出現,所以用c來判斷第幾次出現
第14-16行:當n的大小大於字串,b執行下一行,n和c重新賦值
第17行:將列表變為字串並返回
程式碼執行結果為: