題目描述:
將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。
比如輸入字符串爲 “LEETCODEISHIRING” 行數爲 3 時,排列如下:
L C I R
E T O E S I I G
E D H N
之後,你的輸出需要從左往右逐行讀取,產生出一個新的字符串,比如:“LCIRETOESIIGEDHN”。
請你實現這個將字符串進行指定行數變換的函數:
string convert(string s, int numRows);
示例 1:
輸入: s = “LEETCODEISHIRING”, numRows = 3
輸出: “LCIRETOESIIGEDHN”
示例 2:
輸入: s = “LEETCODEISHIRING”, numRows = 4
輸出: “LDREOEIIECIHNTSG”
解釋:
L D R
E O E I I
E C I H N
T S G
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/zigzag-conversion
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
分析
1.將字符先從上至下,再從下至上變形,再進行輸出
2.可以設置標誌位,從上至下標誌位不斷增加,當標誌位到達最大行數時停止向下,並向上依次遞減至第0行,反覆迭代次過程直到所有字符輸出。
題解
public String convert(String s, int numRows) {
if(numRows==1) return s;
List<StringBuilder> rowList= new ArrayList<>();
for(int i=0;i<Math.max(s.length(),numRows);i++) rowList.add(new StringBuilder());
/**
* 根據行數生成多個字符串序列
* 字符串序列的數目由行數和原始字符串長度共同決定。
* 1.如果字符串長度小於行數,那麼生成字符串長度的字符序列,這是因爲
* 字符串長度不夠行數,每行將只有一個字符,那麼生成字符串長度的字符串
* 序列就可以了。
* 2.字符串長度大於行數,代表每行大於1個字符,這時候按照行數生成字符
* 串序列。
*/
int i=0;
int flag=-1;
for(char c:s.toCharArray())
{
rowList.get(i).append(c);
if(i==0||numRows-i==1) flag=-flag;
/**
* 當行數等於0或最後一行時,我們需要改變行進方向
* 這個思路很精妙,考慮記住
*/
i+=flag;
}
StringBuilder res = new StringBuilder();
for(StringBuilder row : rowList) res.append(row);
return res.toString();
}
感悟
1.行進方向用flag標誌位表示,這非常精妙。