python实现倒n字形排列_Leetcode问题库——Z形变换(Python),补充X形变换,字形
Z字形變換
題目
將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。
比如輸入字符串為 “LEETCODEISHIRING” 行數為 3 時,排列如下:
之后,你的輸出需要從左往右逐行讀取,產生出一個新的字符串,比如:“LCIRETOESIIGEDHN”。
請你實現這個將字符串進行指定行數變換的函數:
示例 1:
輸入: s = “LEETCODEISHIRING”, numRows = 3
輸出: “LCIRETOESIIGEDHN”
示例 2:
輸入: s = “LEETCODEISHIRING”, numRows = 4
輸出: “LDREOEIIECIHNTSG”
解釋:
解題思路
題目理解:
字符串 s 是以 Z 字形為順序存儲的字符串,目標是按行打印。
設 numRows 行字符串分別為 s
1
,s
2
,……,s
n
,則容易發現:按順序遍歷字符串 s 時,每個字符 c 在 Z 字形中對應的 行索引 先從 s
1
增大至 s
n
,再從 s
n
減小至 s
1
…… ,如此反復。
因此,解決方案為:模擬這個行索引的變化,在遍歷 s 中把每個字符填到正確的行 res[ i ] 。
算法流程:
按順序遍歷字符串 s;
res[ i ] += c: 把每個字符 c 填入對應行 s
i
;
i += flag: 更新當前字符 c 對應的行索引;
flag = - flag: 在達到 Z 字形轉折點時,執行反向。
妙用 flag
代碼實現如下:
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows == 1: return s
res = [''] * numRows# res = ["" for _ in range(numRows)]
k,flag = 1,-1
while s:
if k in [1,numRows]:
flag = -flag
res[k-1] += s[0]
s = s[1:]
k += flag
return ''.join(res)
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows < 2: return s
res = ["" for _ in range(numRows)]
i, flag = 0, -1
for c in s:
res[i] += c
if i == 0 or i == numRows - 1: flag = -flag
i += flag
return "".join(res)
X字形變換
題目來自于2020校招華為機試題
題目
給定一個僅由大寫字母組成的字符串以及一個指定的奇列數,按從左到右,從上到下的順序將給定的字符串以X字形排列成指定的列數。
例如,給定字符串為EVERYTHINGGOESWELL,指定列數為3,則大X字形排列為:
然后,從上到下逐列讀取上面的大X字形排列,產生一個新的字符串,如讀取上面的大X字形排列可得目標字符串為:ERHGEEETNOWLVYIGSL
解題思路
題目理解
此題跟 Z 字形變換同理,區別在于,Z 字形變換有順序性,而 X 字形變換具有對稱性,不適合遍歷字符串。
解決方案依舊是模擬行索引的變化,遍歷 strs 中的每個字符填到正確的行 res[ i ]。
算法流程:
res[ k ] += strs[0] :把字符strs[ 0 ] 填入對應的第 k 列,并扔掉strs[ 0 ]
res[n-k-1] += strs[0] :k 沒有走到 mid 位置,將下一個字符填入對應的第 n-k-1 列
flag = -flag :前進到起始位置 k=0 或中間位置 mid ,執行反向
strs = 'EVERYTHINGGOESWELL'# 給定的字符串
n = 3 # 指定列數
res = [''] * n
k,flag = 0,-1 # 初始位置,前進方向
mid = (n-1) // 2
while strs:
res[k] += strs[0]
strs = strs[1:]
# 如果字符串空了
if not strs: break
# 如果沒有走到中點mid
if k != mid:
res[n-k-1] += strs[0]
strs = strs[1:]
# 改變前進方向
if k == mid or k == 0:
flag = -flag
k += flag
print(''.join(res))
另外
除了
Z
字形變換和
X
字形變換外,還可以有
V
字形變換、
N
字形變換等等
總結
以上是生活随笔為你收集整理的python实现倒n字形排列_Leetcode问题库——Z形变换(Python),补充X形变换,字形的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux最新版(linux版下载)
- 下一篇: 个人企业邮箱怎么申请流程(个人企业邮箱怎