力扣日記 006 Z字形變換

2021-09-30 01:25:39 字數 2188 閱讀 6773

將乙個給定字串根據給定的行數,以從上往下、從左到右進行 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...