將乙個給定字串根據給定的行數,以從上往下、從左到右進行 z 字形排列。比如輸入字串為 「leetcodeishiring」 行數為 3 時,排列如下:
l c i r
etoesiig
e d h n
之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如:「lciretoesiigedhn」。
超粗略方法,第一次修改,沒考慮空字串情況;第二次,沒考率字串為單字元;第三次,沒考慮排行為1時。
class
solution
:def
convert
(self, s:
str, numrows:
int)
->
str:
dt=#字典容器
jsq=
0#放在外界的計數器
if numrows==1or
len(s)==1
:return s#所有的特殊情況
defzin
(s,n,x=
0,y=0)
:#內嵌函式,給字串用座標編碼
xunh=
2*n-
2#行數大於等於2以後,可以將字串分割成迴圈段,經過觀察,是2n-2.
nonlocal jsq#內嵌變數宣告
for i in
range
(xunh)
:#開始迴圈編碼
if jsq ==
len(s)
:return
#遞迴結束條件。
dt[(y,x)
]= s[jsq]
jsq +=
1if i < n-1:
x +=
1else
: x -=
1 y +=
1if i==xunh-1:
break
if jsq<
len(s)
: zin(s,n,x,y)
defprintdt
(dt)
: x=
0for i, j in dt.items():
#print(i, j)
x=ireturn x
zin(s,numrows)
ifnot s:
return
'' maxkey=printdt(dt)
ss=''for i in
range
(numrows)
:for j in
range
(maxkey[0]
+1):
mm=dt.get(
(j,i),''
)if mm!='':
ss+=mm
return ss
耗時:836 ms 消耗空間:14.8 mb貼乙個大佬的**
class
solution
:def
convert
(self, s:
str, numrows:
int)
->
str:
if numrows <2:
return s
res =[""
for _ in
range
(numrows)
] i, flag =0,
-1for c in s:
res[i]
+= c
if i ==
0or i == numrows -
1: flag =
-flag
i += flag
return
"".join(res)
時間消耗:68 ms 空間消耗:13.9 mb複雜度分析:
時間複雜度 o(n) :遍歷一遍字串 s;
空間複雜度 o(n) :各行字串共占用 o(n)額外空間。
兩相對比,簡直汗顏。
我果然還是個菜雞,嘖。
力扣 Z字形變換
將乙個給定字串根據給定的行數,以從上往下 從左到右進行 z 字形排列。比如輸入字串為 leetcodeishiring 行數為 3 時,排列如下 l c i r e t o e s i i g e d h n 之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如 lciretoesiiged...
6 Z 字形變換 力扣
將乙個給定字串根據給定的行數,以從上往下 從左到右進行 z 字形排列。l c i r e t o e s i i g e d h n 比如輸入字串為 leetcodeishiring 行數為 3 時,排列如下 之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如 lciretoesiiged...
力扣LeetCode刷題日記(四) Z 字形變換
將乙個給定字串根據給定的行數,以從上往下 從左到右進行 z 字形排列。比如輸入字串為 leetcodeishiring 行數為 3 時,排列如下 l c i r e t o e s i i g e d h n 之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如 lciretoesiiged...