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