深入解析LeetCode--字符串的Z字形變換
題目簡述在LeetCode中有一道關(guān)于字符串Z字形變換的題目,要求將一個(gè)給定字符串根據(jù)給定的行數(shù),以從上往下、從左到右進(jìn)行Z字形排列。本篇文章將分享通過遍歷字符串來填充各行數(shù)據(jù),然后再逐行輸出的算法
題目簡述
在LeetCode中有一道關(guān)于字符串Z字形變換的題目,要求將一個(gè)給定字符串根據(jù)給定的行數(shù),以從上往下、從左到右進(jìn)行Z字形排列。本篇文章將分享通過遍歷字符串來填充各行數(shù)據(jù),然后再逐行輸出的算法。
解題思路
在解題前,我們先拋開題目描述,僅從最終的Z字形輸出來看,其本質(zhì)是遍歷字符串,將各個(gè)字符輸出到不同行中。核心在于行號的變化規(guī)則:當(dāng)處于第一行時(shí),行號遞增;當(dāng)來到最后一行時(shí),行號遞減。
代碼實(shí)現(xiàn)
首先,根據(jù)給定的行數(shù)和字符串長度確定最終輸出的行數(shù),然后創(chuàng)建相應(yīng)數(shù)量的StringBuilder列表用于存儲每行的字符。接著,遍歷字符串的所有字符,根據(jù)不同行號將字符添加到對應(yīng)的StringBuilder中,關(guān)鍵在于處理行號的變化規(guī)則。
```java
public String convert(String s, int numRows) {
if (numRows 1) return s;
List
for (int i 0; i < Math.min(numRows, s.length()); i ) {
(new StringBuilder());
}
int curRow 0;
boolean goingDown false;
for (char c : ()) {
(curRow).append(c);
if (curRow 0 || curRow numRows - 1) goingDown !goingDown;
curRow goingDown ? 1 : -1;
}
StringBuilder result new StringBuilder();
for (StringBuilder row : rows) {
(row);
}
return ();
}
```
測試與輸出
通過編寫主方法進(jìn)行測試,可以驗(yàn)證上述算法的正確性。
```java
public static void main(String[] args) {
Solution solution new Solution();
String input "LEETCODEISHIRING";
int numRows 3;
String output (input, numRows);
(output);
}
```
經(jīng)過測試,控制臺輸出結(jié)果符合預(yù)期,證明算法實(shí)現(xiàn)正確。LeetCode上也有相關(guān)題目,歡迎進(jìn)一步挑戰(zhàn)和學(xué)習(xí)。