阿亮的演算法之路 6 Z 字形變換

2021-10-08 22:59:42 字數 2787 閱讀 6666

看到題目就覺得有戲,看起來複雜了一點,但是憑我的感覺,這題用暴力是比較容易做的,只是可能比較繁瑣。

z型變換,實際上是n型,不過都無所謂,我用乙個二維陣列往裡一套,後面再遍歷拼接成字串,就ok了。只是在往二維陣列裡放值的時候,條件不容易控制,需要慢慢找規律。

思路因為需要慢慢找規律,所以我在草稿紙上畫了一下圖:

這是主要的處理邏輯,然後再對一些特殊和臨界情況進行處理就ok了

首次通過

public

static string convert

(string s,

int numrows)

if(numrows ==2)

else

}for

(int n =

0; n < chars.length; n++)}

}return stringbuilder.

tostring()

;}else

chars[j]

[linecount *

(numrows -1)

]= s.

charat

(i + j);}

i += numrows;

for(

int j =

0; j < numrows -

2; j++

) chars[numrows -

2- j]

[(linecount)

*(numrows -1)

+ j +1]

= s.

charat

(i + j);}

i += numrows -3;

linecount++;}

}for

(int n =

0; n < chars.length; n++)}

}return stringbuilder.

tostring();}}

**冗餘較多,提交結果

初次優化

public

static string convert

(string s,

int numrows)

char

chars =

newchar

[numrows]

[length /2+

1];if

(numrows ==2)

else}}

else

chars[j]

[linecount *

(numrows -1)

]= s.

charat

(i + j);}

i += numrows;

for(

int j =

0; j < numrows -

2; j++

) chars[numrows -

2- j]

[(linecount)

*(numrows -1)

+ j +1]

= s.

charat

(i + j);}

i += numrows -3;

linecount++;}

}}for(

int n =

0; n < chars.length; n++)}

}return stringbuilder.

tostring()

;}

思路沒有變,對一些冗餘的**進行抽取,提交結果

嘿嘿!還不錯。**還可以再簡化一點,但是**簡化了,效率方面卻沒有提公升,可能是因為邏輯沒有變,只是改進了寫法。所以**也就不貼了。

官方給出的題解,也是類似於找規律,但是他找的規律巧妙得多,他利用的是:也是將每個字元放入乙個類似二維陣列的容器,安裝這個n性移動的時候,每次這個行都是朝著乙個方向變的,只是到了頂部或者底部,才會轉向,他就利用了這個特點,巧妙的控制行的變動,最後將這個類似二維陣列的容器再拼接成乙個字串。

**

public string convert

(string s,

int numrows)

stringbuilder ret =

newstringbuilder()

;for

(stringbuilder row : rows) ret.

(row)

;return ret.

tostring()

;}

提交結果

每次官方給出的答案都是如此巧妙,總是簡潔又能完成功能,而且效率還不錯,真好奇這些人腦子裡面裝的是什麼。

哈哈,估計這哥們和我一樣,花了老大工夫,寫了幾十上百行**,還沒人家寫的十幾行**效率高。

今日拿下兩題,噢力給!!!!

6 Z字形變換

一 題目 將字串 paypalishiring 以z字形排列成給定的行數 p a h n a p l s i i g y i r之後從左往右,逐行讀取字元 pahnaplsiigyir 實現乙個將字串進行指定行數變換的函式 string convert string s,int numrows 示例...

6 Z字形變換

將字串 paypalishiring 以z字形排列成給定的行數 p a h n a p l s i i g y i r 之後從左往右,逐行讀取字元 pahnaplsiigyir 示例1 輸入 s paypalishiring numrows 3 輸出 pahnaplsiigyir 示例 2 輸入 s...

6 Z 字形變換

將乙個給定字串根據給定的行數,以從上往下 從左到右進行 z 字形排列。比如輸入字串為 leetcodeishiring 行數為 3 時,排列如下 l c i r e t o e s i i g e d h n之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如 lciretoesiigedh...