1. 程式人生 > 其它 >第100期-基礎結構:字串 Z 字形變換

第100期-基礎結構:字串 Z 字形變換

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
    2(行)-step-22(行)-22(行)
  • 第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行:將列表變為字串並返回

程式碼執行結果為: