對(duì) hard 類(lèi)型的題伙菊,表示目前實(shí)在是 hold 不住迫像,暫時(shí)先不刷啊漫玄。等我刷完 easy 和 medium 回頭再戰(zhàn)茄蚯! 2016/10/10
編程語(yǔ)言是 Java,代碼托管在我的 GitHub 上睦优,包括測(cè)試用例渗常。歡迎各種批評(píng)指正!
<br />
題目 —— ZigZag Conversion
The string "PAYPALISHIRING"
is written in a zigzag pattern on a given number of row like this: (You may want to display this pattern in a fixed font for better legibility)
P A H N
A P L S I I G
Y I R
And then read line by line: "PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3)
should return "PAHNAPLSIIGYIR"
.
<br >
解答
題目大意
給出一個(gè)字符串汗盘,給出行數(shù)皱碘,按照這個(gè)行數(shù)將字符串寫(xiě)成 zigzag 模式,然后按行讀出來(lái)隐孽。-
解題思路
- 我們先來(lái)觀察一下這個(gè) zigzag 模式癌椿,我們發(fā)現(xiàn)健蕊,是按照行讀的,所以每行都可以使用一個(gè) StringBuilder 來(lái)存儲(chǔ)踢俄。
- 觀察列缩功,每一個(gè)豎直的列都有 numRows 行,其他斜的列有 numRows-2 行都办,我們按照這個(gè)特點(diǎn)來(lái)填充 StringBuilder[] 數(shù)組即可嫡锌。
代碼實(shí)現(xiàn)
public class Solution {
public String convert(String s, int numRows) {
StringBuilder[] sb = new StringBuilder[numRows];
for (int i = 0; i < numRows; i++) {
sb[i] = new StringBuilder();
}
int i = 0;
while (i < s.length()) {
for (int rowIndex = 0; rowIndex < numRows && i < s.length(); rowIndex++) {
sb[rowIndex].append(s.charAt(i++));
}
for (int rowIndex = numRows - 2; rowIndex > 0 && i < s.length(); rowIndex--) {
sb[rowIndex].append(s.charAt(i++));
}
}
for (i = 1; i < numRows; i++) {
sb[0].append(sb[i]);
}
return sb[0].toString();
}
}
-
小結(jié)
對(duì)于這種看似“花樣”的題目,剛上來(lái)可能是一臉懵逼琳钉,但仔細(xì)分析過(guò)后會(huì)發(fā)現(xiàn)排列規(guī)律势木,找準(zhǔn)數(shù)據(jù)結(jié)構(gòu)(本題中就是 StringBuilder 數(shù)組)即可迅速解決。另外槽卫,本題需要注意的是跟压,對(duì)于 StringBuilder 數(shù)組,每一個(gè)元素(對(duì)象)都需要初始化歼培。最后還需要將所有的 StringBuilder 連接起來(lái)震蒋。